[Android]EncryptedSharedPreferencesを使った安全なデータ保存

前回の記事で紹介した 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への移行方法」についてまとめてみようと思います。

コメント

タイトルとURLをコピーしました