امنیت داده ها در اندروید

تامین امنیت داده ها در اندروید

داده ها حیاتی ترین و با ارزش ترین دارایی ها در دنیای دیجیتال هستند. بنابراین تامین امنیت داده ها اولین مسئله ای است که شما به عنوان یک توسعه دهنده اپلیکیشن باید به فکر آن باشید. مخصوصا وقتی که نیاز دارید اطلاعات را از طریق اینترنت بین سرور و کلاینت رد و بدل کنید، امنیت داده ها اهمیت بیشتری پیدا میکند. برای این کار میتوانیم از کتابخانه های درونی اندروید، مانند لایبرری Security استفاده کنیم.

در این نوشته از بلاگ برنامه چی میخواهیم درباره تامین امنیت داده ها در اندروید، مدیریت کلید ها، کدگذاری فایل ها و داده ها و استفاده از کلاس های مختلف کتابخانه Security صحبت کنیم. فهرست تیتر های این نوشته را میتوانید در ادامه مشاهده کنید. با برنامه چی همراه باشید.


کتابخانه Security اندروید

امنیت داده ها در اندروید

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

این کتابخانه از الگوی Builder استفاده میکند. اگر با الگوی Builder آشنایی داشته باشید، حتما میدانید این الگو با استفاده از متدهایی ساخته میشود که هرکدام یک آبجکت از خود کلاس را برمیگردانند. یعنی با صدا زدن هر متد، یک ابجکت از کلاس برگردانده میشود که میتوانید یک متد دیگر را روی آن صدا بزنید. هرکدام از این متدها میتوانند کارهای مختلفی انجام بدهند. استفاده از الگوی Builder در کلاس Security به شما این امکان را میدهد که تنظیمات مختلفی را برای هرکدام از سطح های امنیتی زیر انجام بدهید:

  • امنیت قوی با ایجاد تعادل بین کدگذاری عالی و عملکرد خوب: این سطح از امنیت، برای اپلیکیشن هایی مانند بانکداری و پیام رسان، و حتی اپلیکیشن های بسیار جامع که اطلاعات حساسی را دریافت میکنند مناسب میباشد.
  • حداکثر امنیت: این سطح از امنیت مناسب اپلیکیشن هایی است که نیاز به ذخیره سخت افزاری کلید ها و همچنین حضور کاربر برای تامین دسترسی دارند مناسب است.

در این نوشته با هم بررسی میکنیم که بهترین تنظیمات برای استفاده از کتابخانه Security کدام ها هستند، و نحوه نوشتن و خواندن داده های رمزنگاری شده ای که درون فایل یا Shared Preference قرار دارند به صورت ایمن و آسان چگونه است.

نسخه 1.0.0 کتابخانه Security روی دستگاه های که اندروید 6.0 (API 23) یا بالاتر را اجرا میکنند پشتیبانی میشود. ورژن های جدیدتر این کتابخانه، نسخه های بیشتری از سیستم عامل اندروید را پوشش میدهند.


مدیریت کلید ها (Key)

امنیت داده

کتابخانه Security برای مدیریت کلید ها، از یک سیستم دو بخشی استفاده میکند:

  1. یک Keyset که شامل یک یا چند کلید برای کدگذاری فایل یا داده های Shared Preference میباشد. خود این Keyset درون SharedPreferences ذخیره میشود.
  2. یک Primary Key یا Master Key که همه Keyset ها را کدگذاری میکند. این کلید با استفاده از سیستم Android keystore ذخیره میشود.

کلاس هایی که درون کتابخانه وجود دارند

میخواهیم دو تا از کلاس های کتابخانه Security که برای امنیت داده ها مورد استفاده قرار میگیرند را معرفی کنیم. لایبرری Security برای ارائه امنیت بیشتر در کار با داده ها در اندروید، دارای کلاس های زیر میباشد:


کلاس EncryptedFile

encrypt در امنیت داده

این کلاس شامل پیاده سازی (Implementation) های FileInputStream و FileOutputStream و تغییرات و کاستوم سازی روی آنها است. این کلاس ایجاد جریان های خواندن و نوشتن ایمن داده ها را برای شما تضمین میکند.

برای استفاده از جریان های ایمن خواندن و نوشتن داده ها، کتابخانه Security از Streaming Authenticated Encryption with Associated Data یا AEAD استفاده میکند. میتوانید برای مطالعه بیشتر در این باره، داکیومنتیشن های کتابخانه Tink را در گیت هاب مشاهده کنید.


کلاس EncryptedSharedPreferences

encrypt در امنیت داده

این کلاس، SharedPreferences را بصورت خودکار بسته بندی یا Wrap میکند و کلید ها و مقدار ها را با استفاده از یک متد کدگذاری میکند که دارای دو Scheme یا طرح است:

  • کلید ها یا Keys با استفاده از یک الگوریتم کدگذاری جبری رمزگذاری میشوند به طوری که کلید میتواند کدگذاری شود و آنها را به خوبی جستجو کرد.
  • مقادیر یا Values با استفاده از الگوریتم AES-256 GCM که جبری نیست کدگذاری میشوند.

نکته: متدهایی که درون هر دو کلاس EncryptedFile و EncryptedSharedPrefences وجود دارند، Thread-Safe نیستند.

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


اضافه کردن کتابخانه به پروژه

برای استفاده از کتابخانه Security باید Dependency های زیر را به فایل Build.gradle سطح ماژول اضافه کنید:

dependencies {
    implementation "androidx.security:security-crypto:1.0.0-rc04"

    // For Identity Credential APIs
    implementation "androidx.security:security-identity-credential:1.0.0-alpha02"
}

خواندن فایل ها

برای خواندن محتویات یک فایل به صورت ایمن، میتوانید از کلاس EncryptedFile استفاده کنید. تکه کد زیر نحوه استفاده از این کلاس را نشان میدهد:

// Although you can define your own key generation parameter specification, it's
// recommended that you use the value specified here.
Context context = getApplicationContext();
MasterKey mainKey = new MasterKey.Builder(context)
        .setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
        .build();
String fileToRead = "my_sensitive_data.txt";
EncryptedFile encryptedFile = new EncryptedFile.Builder(context,
        new File(DIRECTORY, fileToRead),
        mainKey,
        EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB
).build();

InputStream inputStream = encryptedFile.openFileInput();
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
int nextByte = inputStream.read();
while (nextByte != -1) {
    byteArrayOutputStream.write(nextByte);
    nextByte = inputStream.read();
}

byte[] plaintext = byteArrayOutputStream.toByteArray();

نوشتن فایل ها

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

// Although you can define your own key generation parameter specification, it's
// recommended that you use the value specified here.
Context context = getApplicationContext();
MasterKey mainKey = new MasterKey.Builder(context)
        .setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
        .build();

// Create a file with this name, or replace an entire existing file
// that has the same name. Note that you cannot append to an existing file,
// and the file name cannot contain path separators.
String fileToWrite = "my_sensitive_data.txt";
EncryptedFile encryptedFile = new EncryptedFile.Builder(context,
        new File(DIRECTORY, fileToWrite),
        mainKey,
        EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB
).build();

byte[] fileContent = "MY SUPER-SECRET INFORMATION"
        .getBytes(StandardCharsets.UTF_8);
OutputStream outputStream = encryptedFile.openFileOutput();
outputStream.write(fileContent);
outputStream.flush();
outputStream.close();

برای سناریو هایی که نیاز دارید امنیت بیشتری اعمال شود، میتوانید از قدم های زیر استفاده کنید:

یک آبجکت از KeyGenParameterSPec.Builder بسازید. سپس مقدار true را به متد setUserAuthenticationRequired و یک مقدار بزرگتر از 0 را به متد setUserAuthenticationValidityDurationSeconds پاس بدهید.

از کاربر درخواست کنید که مدارک مورد نیاز را با استفاده از متد createConfirmDeviceCredentialIntent وارد کند.

نکته: کتابخانه Security از BiometricPrompt برای عملیات های کدگذاری پشتیبانی نمیکند.

متد onActivityResult را Override کنید برای اینکه تاییدیه دریافت مدارک از طریق callback به دست شما برسد.


ویرایش Shared Preferences

برای ویرایش ایمن Shared Preferences میتوانید از متد EncryptedSharedPreferences استفاده کنید. کدهای زیر نحوه انجام این کار را به شما نشان میدهند.

String sharedPrefsFile = FILE_NAME;
SharedPreferences sharedPreferences = EncryptedSharedPreferences.create(
        context,
        sharedPrefsFile,
        mainKey,
        EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
        EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
);

SharedPreferences.Editor sharedPrefsEditor = sharedPreferences.edit();
// Edit the user's shared preferences...
sharedPrefsEditor.apply();

سوالی دارید؟

در این نوشته درباره امنیت داده ها در اندروید صحبت کردیم و با معرفی امکانات کتابخانه Security اندروید این کار را آموزش دادیم. اگر هنوز سوالی در ذهن شما وجود دارد میتوانید آن را در قسمت نظرات (همین پایین) بنویسید تا به سرعت به آنها پاسخ بدهیم.


منابع بیشتر برای مطالعه

میتوانید از منابع زیر برای مطالعه بیشتر درباره امنیت داده ها در اندروید استفاده کنید:

دیدگاه‌ خود را بنویسید

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

اسکرول به بالا