LoginSignup
6
2

More than 3 years have passed since last update.

EncryptedSharedPreferences使ってみる

Posted at

概要

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
動作確認用リポジトリ

6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2