Roomを暗号化してみる


経緯

こちらにもありますが、個人情報を扱う場合、データベースの暗号化の必要がありそうだったため、Roomは暗号化できるのか調べたところSQLCipherというライブラリが目に留まりました。

参考

AndroidにSQLCipherを導入してみる
Protect your Room database with SQLCipher on Android | by ...

SQLCipherライブラリの導入

こちらを参考に、build.gradle(app)に追加します。

build.gradle(app)

dependencies {

    implementation "net.zetetic:android-database-sqlcipher:4.4.2"
    implementation "androidx.sqlite:sqlite:2.1.0"
}

データベースを操作する部分

UserDatabase.kt

package com.example.sample

import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import net.sqlcipher.database.SQLiteDatabase
import net.sqlcipher.database.SupportFactory

@Database(entities = [User::class], version = 2, exportSchema = false )
abstract class UserDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao

    companion object{
        fun buildDatabase(context: Context): UserDatabase{
            return Room.databaseBuilder(
                    context,
                    UserDatabase::class.java,
                    "user.db"
            ).openHelperFactory(SupportFactory(SQLiteDatabase.getBytes("test123".toCharArray())))
                    .allowMainThreadQueries()
                    .build()
        }
    }
}


ビルドした際のDBファイルの場所

公式のドキュメントにある通り、
DeviceFileExplorerにて/data/data/app_name/databases内にDBファイルが作成される
(私の場合は/data/data/com.example.rworksample00026/databasesでした)
作成されたファイルをデスクトップとかにダウンロードします。

データベースの中身の確認

DB Browser for sqliteにてSQLcipher側を起動してパスワードを入力すると中身が確認できます。(中身のデータがあればデータも確認できます。)