😽

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 を使う際に利用可能な主な**暗号化方式(アルゴリズム)

  1. 対称鍵暗号(Symmetric Encryption)
  • AES(Advanced Encryption Standard)
    Keystoreで使用できる代表的な共通鍵暗号方式。ファイルや文字列などのデータを暗号化する際に最もよく使われる。
    主な設定項目:
    ブロックモード(BlockMode):
    CBC(Cipher Block Chaining):よく使われる。IVが必要。
    GCM(Galois/Counter Mode):認証付き暗号化(AEAD)。追加の認証データも使える。
    パディング(Padding):
    PKCS7Padding:CBCモード時に使用。
    NoPadding:パディング不要な場合(データ長がちょうどブロック単位)
  1. 非対称鍵暗号(Asymmetric Encryption)
  • RSA(Rivest-Shamir-Adleman)
    公開鍵暗号の代表例。ファイルやデータの暗号化/署名に利用される。
    主な用途:
    小さなデータの暗号化(例:セッションキー)
    デジタル署名(署名生成・検証)
    主な設定:
    暗号化パディング:PKCS1Padding または OAEP
    署名アルゴリズム:SHA256withRSA など

  • EC(Elliptic Curve)
    楕円曲線暗号。RSAよりも短い鍵長で同等の安全性を実現できる。主にデジタル署名に使われる。
    主な用途:
    軽量な署名(例:JWTや認証プロトコル)
    ECDSA(署名)、ECDH(鍵交換)

Discussion