Skip to content

Most visited

Recently visited

navigation

Android Keystore システム

Android Keystore システムを使用すると、コンテナに暗号化キーを格納し、端末からのキーの抽出をより困難にすることができます。キーストアに格納したキーは、エクスポート不可のキーマテリアルを使った暗号化処理に使用できます。さらに、キーを使用するためにユーザー認証を求めたり、特定の暗号化モードでのみキーを使用できるように制限したりするなど、キーをいつどのように使用するかを制限する機能が提供されています。詳細については、セキュリティ機能を参照してください。

Keystore システムは、KeyChain API によって使用される他、Android 4.3(API レベル 18)で導入された Android Keystore プロバイダ機能によっても使用されます。このドキュメントでは、Android Keystore プロバイダをいつどのように使用するかについて説明しています。

セキュリティ機能

Android Keystore システムは、キーマテリアルの不正使用を防止します。最初に、Android Keystore はアプリ プロセスおよび Android 端末からのキーマテリアルの抽出を全体的に防ぐことにより、Android 端末外部でのキーマテリアルの不正使用を低減します。次に、承認するキーの使用法をアプリで指定し、これらの制限をアプリのプロセスの外部に適用することにより、Android 端末でのキーマテリアルの不正使用を低減します。

抽出の防止

Android Keystore キーのキーマテリアルは、次の 2 つのセキュリティ対策によって抽出されないようになっています。

キーの使用承認

Android 端末でキーの不正使用を低減するには、Android Keystore を使用してキーを生成またはインポートするときに、承認するキーの使用法をアプリで指定します。キーを生成またはインポートした後、その承認を変更することはできません。その後、キーが使用されるときは常に、Android Keystore によって承認が適用されます。通常、この高度なセキュリティ機能は、キーを生成またはインポートした後(キーの生成やインポートの前、またはその最中ではない)のアプリ プロセスの侵害によりキーの不正使用が発生しないという要件がある場合にのみ有用です。

サポートされるキーの使用承認は、次のカテゴリに分類されます。

キーマテリアルが安全なハードウェア内にあるキー(KeyInfo.isInsideSecurityHardware() を参照)の追加のセキュリティ対策として、Android 端末に応じて、一部のキーの使用承認が安全なハードウェアによって適用される場合があります。多くの場合、暗号化承認およびユーザー認証承認は安全なハードウェアによって適用されます。一時的な有効期間による承認では、通常、独立した安全なリアルタイム クロックが使用されないため、多くの場合、この承認は安全なハードウェアによって適用されません。

キーのユーザー認証承認が安全なハードウェアによって適用されるかどうかについては、KeyInfo.isUserAuthenticationRequirementEnforcedBySecureHardware() を使用して照会できます。

キーチェーンまたは Android Keystore プロバイダの選択

システム全体の認証情報が必要な場合は、KeyChain API を使用します。アプリが KeyChain API を通じて認証情報の使用をリクエストした場合、ユーザーは、システムが提供する UI を介して、アプリがアクセスできるインストール済みの認証情報を選択します。これにより、いくつかのアプリがユーザーの同意に基づいて同じ認証情報セットを使用できるようになります。

Android Keystore プロバイダを使用して、個々のアプリで、そのアプリだけがアクセスできる独自の認証情報を保存できるようにします。これにより、そのアプリだけが使用できる認証情報をアプリで管理できるようになると同時に、KeyChain API がシステム全体の認証情報に提供するのと同じセキュリティ上のメリットを受けることができます。この方法では、ユーザーの介入なしに認証情報が選択されます。

Android Keystore プロバイダの使用

この機能を使用するには、標準の KeyStore および KeyPairGenerator または KeyGenerator クラスと Android 4.3(API レベル 18)で導入された AndroidKeyStore プロバイダを併用します。

AndroidKeyStore は、KeyStore.getInstance(type) メソッドと併用するための KeyStore タイプとして、さらに KeyPairGenerator.getInstance(algorithm, provider) メソッドおよび KeyGenerator.getInstance(algorithm, provider) メソッドと併用するためのプロバイダとして登録されます。

新しいプライベート キーの生成

新しい PrivateKey を生成するには、自己署名証明書に含められる初期 X.509 属性を指定する必要があります。KeyStore.setKeyEntry を使用して、後で証明書を、認証局(CA)が署名した証明書に置き換えることができます。

キーを生成するには、KeyPairGeneratorKeyPairGeneratorSpec を使用します。

/*
 * Generate a new EC key pair entry in the Android Keystore by
 * using the KeyPairGenerator API. The private key can only be
 * used for signing or verification and only with SHA-256 or
 * SHA-512 as the message digest.
 */
KeyPairGenerator kpg = KeyPairGenerator.getInstance(
        KeyProperties.KEY_ALGORITHM_EC, "AndroidKeyStore");
kpg.initialize(new KeyGenParameterSpec.Builder(
        alias,
        KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY)
        .setDigests(KeyProperties.DIGEST_SHA256,
            KeyProperties.DIGEST_SHA512)
        .build());

KeyPair kp = kpg.generateKeyPair();

新しいシークレット キーの生成

キーを生成するには、KeyGeneratorKeyGenParameterSpec を使用します。

キーストア エントリの操作

AndroidKeyStore プロバイダは、すべての標準の KeyStore API で使用できます。

エントリのリスティング

aliases() メソッドを呼び出して、エントリをキーストアにリストします。

/*
 * Load the Android KeyStore instance using the the
 * "AndroidKeyStore" provider to list out what entries are
 * currently stored.
 */
KeyStore ks = KeyStore.getInstance("AndroidKeyStore");
ks.load(null);
Enumeration<String> aliases = ks.aliases();

データの署名と検証

キーストアから KeyStore.Entry を取得し、sign() などの Signature API を使用して、データに署名します。

/*
 * Use a PrivateKey in the KeyStore to create a signature over
 * some data.
 */
KeyStore ks = KeyStore.getInstance("AndroidKeyStore");
ks.load(null);
KeyStore.Entry entry = ks.getEntry(alias, null);
if (!(entry instanceof PrivateKeyEntry)) {
    Log.w(TAG, "Not an instance of a PrivateKeyEntry");
    return null;
}
Signature s = Signature.getInstance("SHA256withECDSA");
s.initSign(((PrivateKeyEntry) entry).getPrivateKey());
s.update(data);
byte[] signature = s.sign();

同様に、verify(byte[]) メソッドを使用して、データを検証します。

/*
 * Verify a signature previously made by a PrivateKey in our
 * KeyStore. This uses the X.509 certificate attached to our
 * private key in the KeyStore to validate a previously
 * generated signature.
 */
KeyStore ks = KeyStore.getInstance("AndroidKeyStore");
ks.load(null);
KeyStore.Entry entry = ks.getEntry(alias, null);
if (!(entry instanceof PrivateKeyEntry)) {
    Log.w(TAG, "Not an instance of a PrivateKeyEntry");
    return false;
}
Signature s = Signature.getInstance("SHA256withECDSA");
s.initVerify(((PrivateKeyEntry) entry).getCertificate());
s.update(data);
boolean valid = s.verify(signature);

キーの使用にはユーザー認証が必要

キーを生成するとき、またはキーを AndroidKeyStore にインポートするときに、ユーザーが認証されている場合にのみキーの使用が承認されるように指定できます。ユーザーは、安全なロック画面の認証情報のサブセット(パターン、PIN、パスワード、指紋)を使用して認証されます。

通常、この高度なセキュリティ機能は、キーを生成またはインポートした後(キーの生成やインポートの前、またはその最中ではない)のアプリ プロセスの侵害によりキーを使用するためのユーザー認証の要件がスキップされないという要件がある場合にのみ有用です。

ユーザーが認証されている場合にのみキーの使用が承認される場合、キーは次のいずれかのモードで機能するように設定されます。

サポートされているアルゴリズム

Cipher

アルゴリズム サポート対象(API レベル)
AES/CBC/NoPadding 23+
AES/CBC/PKCS7Padding 23+
AES/CTR/NoPadding 23+
AES/ECB/NoPadding 23+
AES/ECB/PKCS7Padding 23+
AES/GCM/NoPadding 23+ 12 バイト長の IV のみがサポートされます。
RSA/ECB/NoPadding 18+
RSA/ECB/PKCS1Padding 18+
RSA/ECB/OAEPWithSHA-1AndMGF1Padding 23+
RSA/ECB/OAEPWithSHA-224AndMGF1Padding 23+
RSA/ECB/OAEPWithSHA-256AndMGF1Padding 23+
RSA/ECB/OAEPWithSHA-384AndMGF1Padding 23+
RSA/ECB/OAEPWithSHA-512AndMGF1Padding 23+
RSA/ECB/OAEPPadding 23+

KeyGenerator

アルゴリズム サポート対象(API レベル)
AES 23+ サポートされるサイズ:128、192、256
HmacSHA1 23+
  • サポートされるサイズ:8~1024、8 の倍数である必要がある
  • デフォルト サイズ:160
HmacSHA224 23+
  • サポートされるサイズ:8~1024、8 の倍数である必要がある
  • デフォルト サイズ:224
HmacSHA256 23+
  • サポートされるサイズ:8~1024、8 の倍数である必要がある
  • デフォルト サイズ:256
HmacSHA384 23+
  • サポートされるサイズ:8~1024、8 の倍数である必要がある
  • デフォルト サイズ:384
HmacSHA512 23+
  • サポートされるサイズ:8~1024、8 の倍数である必要がある
  • デフォルト サイズ:512

KeyFactory

アルゴリズム サポート対象(API レベル)
EC 23+ サポートされるキー仕様: KeyInfo(プライベート キーのみ)、ECPublicKeySpec(パブリック キーのみ)、X509EncodedKeySpec(パブリック キーのみ)
RSA 23+ サポートされるキー仕様: KeyInfo(プライベート キーのみ)、RSAPublicKeySpec(パブリック キーのみ)、X509EncodedKeySpec(パブリック キーのみ)

KeyStore

KeyStore は、KeyPairGenerator および KeyGenerator と同じキータイプをサポートします。

KeyPairGenerator

アルゴリズム サポート対象(API レベル)
DSA 19–22
EC 23+
  • サポートされるサイズ:224、256、384、521
  • サポートされる名前付き曲線:P-224(secp224r1)、P-256(secp256r1 および prime256v1)、P-384(secp384r1)、P-521(secp521r1)

API レベル 23 よりも前のバージョンで EC キーを生成するには、setKeyType(String) でキータイプを "EC" に設定した KeyPairGeneratorSpec で初期化された、RSA 暗号化アルゴリズムの KeyPairGenerator を使用します。この方法を使用して EC 曲線名を指定することはできません。NIST P 曲線は、リクエストされたキーサイズに基づいて自動的に選択されます。

RSA 18+
  • サポートされるサイズ:512、768、1024、2048、3072、4096
  • サポートされる公開指数:3、65537
  • デフォルトの公開指数:65537

Mac

アルゴリズム サポート対象(API レベル)
HmacSHA1 23+
HmacSHA224 23+
HmacSHA256 23+
HmacSHA384 23+
HmacSHA512 23+

Signature

アルゴリズム サポート対象(API レベル)
MD5withRSA 18+
NONEwithECDSA 23+
NONEwithRSA 18+
SHA1withDSA 19–22
SHA1withECDSA 19+
SHA1withRSA 18+
SHA1withRSA/PSS 23+
SHA224withDSA 20–22
SHA224withECDSA 20+
SHA224withRSA 20+
SHA224withRSA/PSS 23+
SHA256withDSA 19–22
SHA256withECDSA 19+
SHA256withRSA 18+
SHA256withRSA/PSS 23+
SHA384withDSA 19–22
SHA384withECDSA 19+
SHA384withRSA 18+
SHA384withRSA/PSS 23+
SHA512withDSA 19–22
SHA512withECDSA 19+
SHA512withRSA 18+
SHA512withRSA/PSS 23+

SecretKeyFactory

アルゴリズム サポート対象(API レベル)
AES 23+ サポートされるキー仕様: KeyInfo
HmacSHA1 23+ サポートされるキー仕様: KeyInfo
HmacSHA224 23+ サポートされるキー仕様: KeyInfo
HmacSHA256 23+ サポートされるキー仕様: KeyInfo
HmacSHA384 23+ サポートされるキー仕様: KeyInfo
HmacSHA512 23+ サポートされるキー仕様: KeyInfo
This site uses cookies to store your preferences for site-specific language and display options.

Get the latest Android developer news and tips that will help you find success on Google Play.

* Required Fields

Hooray!

WeChat で Google Developers をフォローする

Browse this site in ?

You requested a page in , but your language preference for this site is .

Would you like to change your language preference and browse this site in ? If you want to change your language preference later, use the language menu at the bottom of each page.

This class requires API level or higher

This doc is hidden because your selected API level for the documentation is . You can change the documentation API level with the selector above the left navigation.

For more information about specifying the API level your app requires, read Supporting Different Platform Versions.

Take a short survey?
Help us improve the Android developer experience. (Dec 2017 Android Platform & Tools Survey)