حسام رسولیان

افزایش امنیت اپلیکیشن های اندروید با Android Jetpack Security

امنیت همیشه یکی از مباحث مهم در توسعه نرم افزار های کامپیوتری می باشد و اپلیکیشن های اندروید نیز از این قاعدع مستثنی نیستند.

به همین منظور در سال ۲۰۱۹ گوگل کتابخانه Jetpack Security را برای رمزنگاری اطلاعات و فایل ها در اندروید معرفی کرد تا مراحل افزایش امنیتی اپلیکیشن ها را آسان تر کند.

با توجه به افزایش استفاده افراد از گوشی های هوشمند در زندگی روزمره توجه به تهدیدات امنیتی و حریم خصوصی یکی از مسائل مهم مهندسی نرم افزار می باشد.

Jetpack Security چیست؟

هر چقدر که سیستم عامل اندروید امن باشد با این حال در دو حالت امنیت برنامه شما در خطر تهدید توسط دیگران است.

گوشی های روت شده: اگر برنامه شما روی یک گوشی روت شده نصب شود به این ترتیب به تمام فایل های برنامه شما دسترسی پیدا خواهند کرد که باعث کاهش امنیت اپلیکیشن می شود.

ارسال اطلاعات: در تمام اپلیکیشن های آنلاین یک سری اطلاعات بین کلاینت و سرور رد و بدل می شود که مهاجم با گوش دادن به این اطلاعات میتواند به دیتا های مهم برنامه شما پی ببرد و از این اطلاعات استفاده کند.

برای حل این دو مشکل اساسی گوگل تصمیم به معرفی Jetpack Security گرفت.

با استفاده از این کتابخانه میتوانید فایل ها کلید های خود را به آسانی رمزنگاری کنید و همچنین از نسخه ایمن شده shared preferences استفاده کنید.

این کتابخانه از الگوی builder برای ایجاد تنظیمات پیشفرض رمزنگاری ها استفاده میکند.

همچنین حالت های مختلفی برای ساخت فایل های رمزنگاری شده وجود دارد.

Strong security: این حالت برای رمزنگاری یک حالت تعادلی بین امنیت و عملکرد برنامه رعایت میکند.

این حالت مناسب اپلیکیشن های خدماتی و مصرف کننده مثل پیامرسان ها و موبایل بانک ها می باشد.

Maximum security: این حالت مناسب زمانی هست که به ذخیره سازی کلید بصورت سخت افزاری نیاز دارید.

خود کتابخانه AndroidX Security بر اساس کتابخانه امنیتی Tink ساخته شده است.

کتابخانه Jetpack Security

Jetpack Security چگونه کار میکند؟

یکی از موارد استفاده از آن در SharedPreferences که از الگوریتم AES برای رمزنگاری اطلاعات استفاده میکند.

از یک SubKeys برای رمزنگاری و رمزگشایی استفاده میکند که خود به وسیله یک Master Key رمزنگاری شده است.

این SubKeys ها داخل یک SharedPreferences ذخیره میشوند و Master key هم در AndroidKeystore.

Master Key

مهم ترین بخش این کتابخانه تولید و مدیریت Master Key است. این کلید به روش های زیر قابل تولید است:

رشته کد شده: این روش خیلی پیشنهاد نمیشود.

AES256_GCM_SPEC: این روش پیشنهاد می شود و از طریق خود کتابخانه قابل پیاده سازی است.

val masterKey = MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC)

Custom key: این روش برای اپلیکیشن هایی که به امنیت بسیار بالا و احراز هویت کاربران برای دسترسی به اطلاعات داخلی نیاز دارند مناسب است.

اما بریم سراغ نصب کتابخانه Jetpack Security.

این کتابخانه روی نسخه اندروید ۶٫۰ و به بالا قابل اجرا است.

    implementation "androidx.security:security-crypto:1.0.0-rc02"

همچنین برای ساخت کلید ها هم میتوانیم به روش زیر عمل کنیم.

val keyGenParameterSpec = MasterKeys.AES256_GCM_SPEC
val masterKeyAlias = MasterKeys.getOrCreate(keyGenParameterSpec)

رمزنگاری فایل

یکی از قابلیت های مهم Jetpack Security ساخت فایل های رمزنگاری شده است که اینکار و زمان اجرای اپلیکیشن هم میتوانید انجام دهید. کافی مثل ساخت یک فایل معمولی عمل کنید اما به شکل زیر.

val fileToRead = "my_sensitive_data.txt"
val encryptedFile = EncryptedFile.Builder(
    File(directory, fileToRead),
    context,
    masterKeyAlias,
    EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB
).build()

کلاس EncryptedFile درواقع بازنویسی انجام شده از کلاس FileInputStream است و باعث افزایش امنیت در زمان خواندن و نوشتن فایل می شود.

اگر بعد از ساخت فایل نیاز به خواندن یا ویرایش فایل داشتید میتوانید از متد های openFileOutput و openFileInput استفاده کنید.

encryptedFile.openFileOutput().bufferedWriter().use { bufferedWriter ->         
         // Writing some data..    
}    
 
encryptedFile.openFileInput().bufferedReader().useLines { lines -> 
         // Reading data..    
}

رمزنگاری SharedPreferences

ذخیره سازی اطلاعات داخل shared preferences بسیار گزینه محبوبی هستند به دلیل راحتی و عدم نیاز به دیتابیس اما همیشه یکی از گزینه های آسان برای افراد مهاجم بودند.

ایجاد shared preferences رمزنگاری شده با ساخت فایل های رمزنگاری شده تفاوت بسیار زیادی ندارد و از طریق کد زیر میتوانید این کار را انجام دهید.

securedSharedPrefs = EncryptedSharedPreferences.create(
    "values_secured",   //xml file name
    master_key,   //master key
    this,   //context
    AES256_SIV,  //key encryption technique
    AES256_GCM  //value encryption technique  

طبق کد بالا برای رمزنگاری کلید ها از روش AES256_SIV و برای مقدار ذخیره سازی شده از AES256_GCM استفاده میکنیم.

حالا برای ذخیره کردن اطلاعات و خواندن به شکل زیر عمل میکنیم.

//to save a value
securedSharedPrefs.edit().putString("name", "android").apply()

//to fetch a value
securedSharedPrefs.getString("name", "")

اگر فرد مهاجم به فایل shared preferences دسترسی پیدا کند به شکل زیر آنرا میبیند.

<map>
    <string name="ASx6qQDkW3HGEejBxpA3jWAxQl/FKavIIt50b5QuYQY=">AUcTQT3WS49w2VFXDhjIUHv6QyTfkPAVACxp5GijeGNLOIJOMRCIHIJjpaB3</string>
</map>

نکته قابل توجه این است که shared preferences های رمزنگاری شده سرعت خواندن و نوشتن کمتری نسبت به حالت عادی دارند به همین دلیل در سعی کنید در جای مناسبی از آنها استفاده کنید.

نظر دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *