SQLCipher ile Room Database Şifreleme

Cem Ercioğlu
Asis Technologies
Published in
2 min readSep 7, 2021

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/

--

--

Cem Ercioğlu
Asis Technologies

Mobile apps development manager at Asis Elektronik and a android developer