Encrypted Preferences

Bir önceki yazımda Shared Preferences hakkında bahsettim. Bu yapıyı kullanmanın sakıncaları tabii ki var, bazen önemli kullanıcı verileri kaydettiğiniz zamanlar olabilir, bu veriler de kötü niyetli kişilerin ellerine geçebilir. Bu yapıyı kriptolu bir şekilde kullanarak güvenliği artırabileceğiz. İite bunu da Encrypted Preferences yardımıyla yapacağız.

Android M (API 23) ile birlikte Android Jetpack Security kütüphanesi geldi. İçerisindeki security paketi EncryptedSharedPreferences yapısı barındırmaktadır. Bu versiyondan önce verileri kriptolamak için de birçok kütüphane yazıldı, facebook/conceal gibi. Gelen resmi kütüphane de rahat bir nefes aldırdı.

Security kütüphanesi, builder pattern kullanmasının yanı sıra mantıken kullanıcı bazlı banka ve chat gibi uygulamar için uygundur. Key yönetimi için iki kısımlı sistemi vardır.

  • SharedPreferences bünyesinde bulunan, bir dosyayı veya paylaşılan tercih verilerini şifrelemek için bir veya daha fazla anahtar içeren keyset yapısı kullanır.
  • Android Keystore bünyesinde bulunan, tüm keysetleri şifreleyen bir master key kullanır.

Hemen örnek kullanışına bakalım. Minsdk versiyonu 23 yaptıktan sonra ilk olarak dependency sağlamamız gerekiyor.

dependencies {
    implementation "androidx.security:security-crypto:1.0.0-alpha02"
}

Daha sonra Android KeyStore’dan master key alıyoruz. Bu master key ile EncryptedSharedPreferences instance’ı oluşturuyoruz.

String masterKeyAlias = MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC);

  SharedPreferences sharedPreferences = EncryptedSharedPreferences.create(
      "secret_shared_prefs",
      masterKeyAlias,
      context,
      EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
      EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
  );

  // use the shared preferences and editor as you normally would
  SharedPreferences.Editor editor = sharedPreferences.edit();

Veri okuma / yazma
Encrypted Preferences kullanırken normal SharedPreferences gibi veriyi kaydediyoruz okuyabiliriz.

// save entries
sharedPreferences.edit()
    .putString("DATA", saveText.text.toString())
    .apply()

// read entries
String value = sharedPreferences.getString("DATA", "")

Peki gerçekten kriptolama işlemini yaptı mı diye merak ediyorsanız kendi denemenizi yaptıktan sonra Device File Explorer ile dosyayı açıp kriptolu dosyanın içerisini görebilir veya buradaki örnek uygulamaya göz atabilirsiniz.

Performans
Şimdi gelelim hız tarafına, aşağıda yapılan testlerde normal pref. ile encrypted pref. arasındaki farkı görebilirsiniz.

EncryptedNormal
Initialize/Open50ms0ms
Save value7ms1ms
Read value2ms1ms