前回の記事で紹介した SharedPreferences は、アプリでのちょっとしたデータ保存に便利です。ただし、そのまま使うと中身は平文で保存されてしまいます。そのため、もし端末をルート化されたりアプリの内部ファイルを直接見られた場合、ユーザーの情報が漏れてしまう危険があります。
そこで登場するのが EncryptedSharedPreferences です。これはAndroid Jetpack Securityライブラリに含まれている仕組みで、暗号化された状態でSharedPreferencesを扱えるようになります。
EncryptedSharedPreferencesとは?
- 通常のSharedPreferencesと同じように使える
- 自動で暗号化・復号を行ってくれる
- MasterKeyを利用して安全にキーを管理できる
- Android 6.0 (API 23) 以降で利用可能
つまり、今までのコードを大きく変えることなく、そのまま安全性を高められるわけです。
導入手順
まずは依存関係を追加します。Gradleに以下を記述してください。
dependencies {
implementation "androidx.security:security-crypto:1.1.0-alpha06"
}
バージョンは執筆時点のものです。最新は 公式リリースノート を確認してください。
実装例
実際に EncryptedSharedPreferences
を使ったサンプルコードです。
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.security.crypto.EncryptedSharedPreferences
import androidx.security.crypto.MasterKey
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// MasterKeyを生成(AES256)
val masterKey = MasterKey.Builder(this)
.setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
.build()
// 暗号化されたSharedPreferencesを生成
val securePrefs = EncryptedSharedPreferences.create(
this,
"secure_prefs", // ファイル名
masterKey,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
)
// 保存処理
with(securePrefs.edit()) {
putString("username", "taro")
putBoolean("isLogin", true)
apply()
}
// 読み出し処理
val username = securePrefs.getString("username", "guest")
val isLogin = securePrefs.getBoolean("isLogin", false)
println("username=$username, isLogin=$isLogin")
}
}
ポイント解説
MasterKeyについて
MasterKey
は暗号化に使う鍵のことです。Android Keystoreを利用して安全に管理されるため、アプリが直接鍵を扱うことはありません。
KeyとValueの暗号化方式
PrefKeyEncryptionScheme.AES256_SIV
… Key(キー名)を暗号化PrefValueEncryptionScheme.AES256_GCM
… Value(値)を暗号化
つまり、保存されるファイルを直接開いても「キーも値も暗号化されている」状態になるので、簡単には中身が読めません。
通常のSharedPreferencesとの違い
書き込み・読み出しのコードは基本的に同じです。そのため、既存のSharedPreferencesから切り替えるのも容易です。
注意点
- API 23 (Android 6.0) 以降でのみ利用可能
- 暗号化のため、処理は通常のSharedPreferencesよりやや重い
- 大量のデータ保存には不向き → 基本的には設定値や認証情報専用
まとめ
EncryptedSharedPreferences を使えば、今までとほぼ同じ感覚でデータを保存しつつ、安全性を高めることができます。
- 内部的に自動で暗号化してくれる
- MasterKeyを利用して安全に管理
- セキュリティが求められる情報の保存に最適
👉 次回は「既存のSharedPreferencesからEncryptedSharedPreferencesへの移行方法」についてまとめてみようと思います。
コメント