Jetpack Security ile Veri Şifreleme

Güncelleme tarihi: 17 Haz 2021


Görsel Referansı


Daha önce uygulama içerisinde veri şifrelemeyi denemişsinizdir. Bir geliştirici olarak veriyi güvenli şekilde tutmayı ve erişmeyi isteyebilirsiniz. Fakat Android'de veriyi, ayrılmış bir alanda güvenli şekilde kullanmanıza pek imkan yoktur. İnternette veriyi nasıl şifreleyeceğize dair araştırma yaparsanız büyük ihtimalle yıllar önce yazılmış bir çok eski yazıyla karşılaşırsınız.


Jetpack Security (bundan sonra jetsec diyeceğiz.) şifreleme kütüphanesi; dosyaları ve SharedPreferences nesnelerini şifrelemeyi mümkün kılıyor. Bu kütüphane, veriyi şifrelerken güvenli ve iyi bilinen şifreleme ilkelerinden olan AndroidKeyStore'u kullanıyor. EncryptedFile ve EncryptedSharedPreferences kullanmak, hassas verileri, API key’lerini, OAuth token’ları ve diğer gizli verileri lokalde güvenli şekilde saklamanıza imkan tanır.


Öncelikle veriyi neden şifreli olarak tutmak istediğimize karar vermeliyiz. Eğer uygulamanız paylaşılan veri alanını kullanıyorsa şifrelenmelidir. Eğer uygulamanızda kullanıcının sağlık kayıtları, finansal verileri, işiyle ilgili veriler saklayıp işliyorsanız da şifreleme yapmanız gerekir. Ayrıca eğer mümkünse, bu verileri biometric erişelebilir yapmanızda da fayda var.


Jetsec’in alt yapısını oluşturan Tink, açıkkaynaklı, crossplatform bir güvenlik kütüphanesidir ve Google tarafından geliştirilmiştir. Jetsec veri yapısı Tink ile tam uyumludur.

Tink ile ilgili daha fazla bilgiye buradan ulaşabilirsiniz.


Key Üretmek


Verinizi şifreleme sürecine sokmadan önce, Jetsec’in uygulamanızı nasıl güvenli tutacağını anlayalım. Jetsec tüm alt verileri şifreleyen ve birtakım şifreleme operasyonlarından geçiren master key kullanır. Jetsec size default olarak MasterKeys class’ının içerisinde bir obje sağlar. MasterKeys class’ı AES256-GCM algoritmasıyla şifrelenen ve saklanan AndroidKeyStore verileri kullanır. Bu AndroidKeyStore verileri şifrelenmiş anahtarları saklayan bir konteynır olan TEE ve Stronbox içerir.


İlk olarak Jetsec’in AES25_GCM_SPEC özelliğini kullanacağız. AES256_GCM simetrik ve genel olarak güncel cihazlarda hızlı çalışır.


val keyAlias = MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC)