SQLCipher ile Room Database Şifreleme
SQLite ve Room Database
Android uygulamalarımızda bazı durumlarda verilerimizi çevrimdışı olarak saklamak ve okumak isteyebiliriz. Bu gibi durumlarda çok yaygın kullanılan androidx kütüphanelerinin de içinde bulunduğu SQLite Database motorunu kullanabiliriz.
Room kütüphanesi ise SQLite’ın tüm özelliklerini içinde barındırır ve SQLite üzerinde bir katman sağlar. Room ile SQL sorgularının derleme zamanlarında fayda sağlarken, tekrarlayan kodu ve hataya açık kodu da en aza indirir. Migration işlemlerinde kolaylıklar sağlar.
Bu faydalarından dolayı da zaten android developers direkt SQLite Api kullanımı yerine Room kullanımını önermektedir.
https://developer.android.com/training/data-storage/room
Room kütüphanesini eklemek için app gradle dosyanıza aşağıdaki bağımlılıkları ekleyin
implementation "androidx.room:room-ktx:2.3.0"
kapt "androidx.room:room-compiler:2.3.0"
// optional - Kotlin Extensions and Coroutines support for Room
//implementation "androidx.room:room-ktx:$room_version"
SQLCipher
Üstte de belirtildiği gibi Room SQLite ile çalışır. SQLite ise veritabanını dosya olarak şifrelenmemiş bir şekilde saklar. Herhangi bir şekilde bu veritabanı dosyasına sahip olan birisi dolayısıyla da içerisine saklamış olduğunuz verilerinize de erişebilir.
SQLCipher ise SQLite veritabanı dosyalarının 256-bit AES şifrelenmesini sağlayan açık kaynak kodlu bir kütüphanedir.
SQLCipher ile SQLite üzerinde bir şifreleme katmanı ekleyebiliriz ve böylece veritabanı dosyası herhangi bir kişi tarafından ele geçirildiğinde okunamaz halde olacaktır.
SQLCipher kütüphanesine bir key vermemiz gerek ve bu keyin güvenliğin sorumluğu bizim tarafımızda. Key’i oluşturma ve saklamak için de ayrıca bir yazı hazırlıyor olacağım
SQLCipher Android 4.1 — Android 10 için armeabi-v7a, x86, x86_64, ve arm64_v8a mimarileriyle çalışır.
SQLCipher kütüphanesini eklemek için app gradle dosyanıza aşağıdakileri ekleyin
implementation "net.zetetic:android-database-sqlcipher:4.4.2"
implementation "androidx.sqlite:sqlite-ktx:2.1.0"
Room ile SQLCipher kullanımı
SQLCipher SQLite ‘ın eklentisi olduğu için tüm SQLite fonksiyonları kullanılabilir ve böylece Room fonksiyonlarını etkilemez. Entity, DAO lara ek bir müdahale yapmadan aynı şekilde kullanabilirsiniz.
SQLCipher room veritabanına eklemeniz için :
var passphrase: ByteArray = "Cem123".toByteArray()val factory = SupportFactory(passphrase)
SQLCipher SupportFactory sınıfının yapıcı metoduna verdiğimiz parola ile oluşturduğumuz factory örneğini RoomDataBase builder’a ekliyoruz. ve.. işlem tamam.
.openHelperFactory(factory)
RoomDatabase imizin son hali ise:
fun getDatabase(
context: Context,
scope: CoroutineScope
): AppDatabase {
val passphrase: ByteArray = "Cem123".toByteArray()
val factory = SupportFactory(passphrase)
return Room.databaseBuilder(
context.applicationContext,
AppDatabase::class.java,
"AsisDB"
)
.openHelperFactory(factory)
.addCallback(AppDatabaseCallback(scope))
.build()
}
Özetlemek gerekirse mevcut room sqlite projemize sadece SQLCipher SupportFactory ekleyerek sqlite database güvenliğini arttırabiliriz.
Önemli Not: Şifrelemede kullandığımız parolayı nasıl oluşturduğumuza ve sakladığımıza dikkat etmemiz gerek. Hardcoded olmasından kaçınmalıyız.
GitHub linki: https://github.com/cemercioglu/RoomDBWithCipher.git
Kaynaklar:
https://developer.android.com/training/data-storage/room
https://www.zetetic.net/sqlcipher/design/