概要
Androidで暗号化して保存する仕組みを自前で実装するのが大変でしたが、JetpackのSecurityにEncryptedSharedPreferences
という便利なものが登場したので触ってみました。
まだ2019/10月時点でalpha版なので使えるのは少し先になりそうです。
KeyStoreで色々と苦労したのでもっと早く出てきてほしかったです。
使ってみる
ライブラリを入れる。現時点で1.0.0−alpha02です。
build.gradle
def security_version = "1.0.0-alpha02"
implementation "androidx.security:security-crypto:$security_version"
保存する
MainActivity.kt
val masterKeyAlias = MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC)
val preferences = EncryptedSharedPreferences.create(
"secret_shared_prefs",
masterKeyAlias,
applicationContext,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
)
val editor = preferences.edit()
editor.putString("hoge", "hoge")
editor.apply()
SharedPreferencesと同じ実装なのですごく使いやすいです。
minSDK23以下で利用する場合はOS6系未満のときに独自に暗号化などするする必要があります。また、そのときは5系のOSが6にアップデートしたときにデータ移行なども考えないとデータが消えてしまいます(現時点でどれくらいアップデートユーザがいるかは不明ですが)
AndroidManifestt.xml
<uses-sdk tools:overrideLibrary="androidx.security" />
MainActivity.kt
private fun getEncryptedSharedPreferences() = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
val masterKeyAlias = MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC)
EncryptedSharedPreferences.create(
"secret_shared_prefs",
masterKeyAlias,
applicationContext,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
)
} else {
// Android5系以下では利用できないので独自に暗号化が必要(ここでは単にSharedPreferencesを利用)
getSharedPreferences(
"secret_shared_prefs",
Context.MODE_PRIVATE
)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val preferences = getEncryptedSharedPreferences()
val editor = preferences.edit()
editor.putString("hoge", "hoge")
editor.apply()
}
なお、バックアップでの利用は不可になります。
#リンク
Developers
動作確認用リポジトリ