Android SharedPreferencesへの平文保存

Android SharedPreferencesへの機密情報の平文保存

説明

SharedPreferencesは、Androidアプリ内へ値を簡単に保存するAPIです。認証トークン、セッションID、個人識別情報などを平文で保存すると、root化された端末、バックアップ、デバッグによる抽出、他のローカルな侵害経路から漏えいするおそれがあります。

想定される影響

  • 認証トークンやセッションの窃取
  • 個人情報やアプリ内部設定の漏えい
  • 盗まれた値の再利用によるアカウントへのアクセス

対処方法

  1. 可能なら機密性のある値を端末へ保存しないでください。
  2. 保存が必要なら、Android Keystoreで鍵を保護し、維持管理されているプラットフォームの暗号APIや、検証済みの暗号化ストレージを使ってください。EncryptedSharedPreferencesはAndroidX Security 1.1.0から非推奨なので、新規コードの標準的な選択肢にしないでください。
  3. 同じ値がログ、バックアップ、デバッグ経路から漏れていないかも確認してください。

例

変更後は、既存のEncryptedSharedPreferences実装を説明するレガシーの例です。contextとKeystoreを使うmasterKeyの準備は省略しています。復元後に鍵が使えない可能性があるため、このファイルはAuto Backupから除外してください。

変更前

java
preferences.edit().putString("auth_token", token).apply();

変更後

java
SharedPreferences preferences = EncryptedSharedPreferences.create(
    context,
    "secure_prefs",
    masterKey,
    EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
    EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
);
preferences.edit().putString("auth_token", token).apply();

説明:

  • 変更前: 機密性のある値を平文で保存し、バックアップ、root化端末、デバッグ抽出、脆弱なローカルアクセス経路から漏えいする可能性があります。
  • 変更後: 既存のEncryptedSharedPreferencesがキーと値を暗号化します。新しい実装では、前述のサポートされる暗号化方式を選んでください。端末やアプリプロセスが侵害された状況のすべてを、暗号化だけで防ぐことはできません。

参考資料