Android Keystoreによる安全な暗号鍵管理とデータ保護
1. はじめに
今回は「Android KeyStore」を活用したセキュリティ対策について紹介します。
モバイルアプリは、ログイン情報、セッションID、個人情報など、多くの機密データを端末内に保存するケースが多くあります。これらを平文保存してしまうと、端末の盗難やリバースエンジニアリングにより、簡単に情報が漏洩するリスクがあります。
2. 鍵をソースコードに埋め込み危険性
よくみられる実装が「鍵をソースコードで直書きする」というものです。(dex2jarなどを使うと簡単に取れる。)
たとえ以下のようにコードです。
val secretKey = "my-super-secret-key"
しかし、apkファイルは簡単に逆コンパイル可能で、ソースコードに書かれた鍵はすぐに見つけられてしまいます。結果としてapkから暗号鍵を抜き出して情報を解読することができます。

<dex2jarを使って逆コンパイルして平文が見える>
3. Android Keystoreとは
Android KeyStoreは、端末内のセキュアな領域で暗号鍵を生成・管理できる機構です。生成された鍵は、アプリ内には一切出せず、専用のAPI経由でしか利用できません。
特にTEE(Trusted Execution Environment)やStrongBox(セキュアHW)に保存されることで、非常に高い安全性を確保されます。
アプリ毎に鍵を分離できるのもポイントで、他のアプリやシステムにも読み取られません。
※ TEE : SoC(System on Chip)内の安全な実行環境(多くの端末が対応)
※ StrongBox:専用のセキュリティチップ(HSM)を利用。より安全だが対応端末は限られる。
※ アーキテクチャの概要
アプリ
│
├── Android Keystore API
│ ├── 鍵の生成/取得
│ ├── 署名/暗号化
│ └── 属性の設定
│
└── Keystore Provider
├── TEE(TrustZone) or StrongBox(Secure Element)による物理的隔離
└── ソフトウェアベース(低セキュリティ端末向け)
4. Keystoreを使った暗号化処理
実際のコードみてましょう。KeyStoreを使ってAES鍵を生成するコードです。
val keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, KEY_PROVIDER)
val keyGenSpec = KeyGenParameterSpec.Builder(
KEY_ALIAS,
KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT
)
.setBlockModes(KeyProperties.BLOCK_MODE_CBC)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)
.setRandomizedEncryptionRequired(false)
.build()
keyGenerator.init(keyGenSpec)
keyGenerator.generateKey()
暗号化は Cipher クラスで行い、復号時には保存しておいたIV(初期化ベクトル)を使います。
KeyStoreに保存された鍵はコードから取得できませんが、Chiper経由で仕様することができます。
5. 実用上の注意点
- OSによってはStringBoxなど一部の機能が使えないことがあります。(AESはOS6.0以上、GCMモードのAESはOS10以上、StrongBoxはOS9以上)
- EncryptedSharedPreferencesを使えば、SharedPreferencesのデータも簡単に暗号化できます。
- ルート化された端末ではアプリ内の復号処理が悪用されることもあり、完璧なセキュリティは保証できません
- それでも、KeyStoreを使うことで通常の高家機への耐性は多く向上します。
6. まとめ
今回はAESのアルゴリズムで紹介しましたが、RSAやECの方式もあります。
モバイルアプリのセキュリティにおいて、暗号鍵の安全な管理は元も重要なポイントの一つです。Android KeyStoreをりようすれば、コードに鍵をハードコーディングせず、安全に鍵を生成・利用できます。
※ Android Keystore を使う際に利用可能な主な**暗号化方式(アルゴリズム)
- 対称鍵暗号(Symmetric Encryption)
- AES(Advanced Encryption Standard)
Keystoreで使用できる代表的な共通鍵暗号方式。ファイルや文字列などのデータを暗号化する際に最もよく使われる。
主な設定項目:
ブロックモード(BlockMode):
CBC(Cipher Block Chaining):よく使われる。IVが必要。
GCM(Galois/Counter Mode):認証付き暗号化(AEAD)。追加の認証データも使える。
パディング(Padding):
PKCS7Padding:CBCモード時に使用。
NoPadding:パディング不要な場合(データ長がちょうどブロック単位)
- 非対称鍵暗号(Asymmetric Encryption)
-
RSA(Rivest-Shamir-Adleman)
公開鍵暗号の代表例。ファイルやデータの暗号化/署名に利用される。
主な用途:
小さなデータの暗号化(例:セッションキー)
デジタル署名(署名生成・検証)
主な設定:
暗号化パディング:PKCS1PaddingまたはOAEP
署名アルゴリズム:SHA256withRSAなど -
EC(Elliptic Curve)
楕円曲線暗号。RSAよりも短い鍵長で同等の安全性を実現できる。主にデジタル署名に使われる。
主な用途:
軽量な署名(例:JWTや認証プロトコル)
ECDSA(署名)、ECDH(鍵交換)
Discussion