KeyProtection クラス
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
Android キーストア システムにインポートするときにキーまたはキー ペアをセキュリティで保護する方法の指定。
[Android.Runtime.Register("android/security/keystore/KeyProtection", ApiSince=23, DoNotGenerateAcw=true)]
public sealed class KeyProtection : Java.Lang.Object, IDisposable, Java.Security.KeyStore.IProtectionParameter
[<Android.Runtime.Register("android/security/keystore/KeyProtection", ApiSince=23, DoNotGenerateAcw=true)>]
type KeyProtection = class
inherit Object
interface KeyStore.IProtectionParameter
interface IJavaObject
interface IDisposable
interface IJavaPeerable
- 継承
- 属性
- 実装
注釈
Android キーストア システムにインポートするときにキーまたはキー ペアをセキュリティで保護する方法の指定。 このクラスは、キーの使用にユーザー認証が必要かどうか、キーが承認される操作 (暗号化解除、署名なしなど) と、キーの有効期間の開始日と終了日など、インポートされたキーの承認された使用方法を指定します。 このクラスで表されるキー使用承認は、秘密鍵と秘密キーにのみ適用されます。公開キーは、サポートされている任意の操作に使用できます。
キーまたはキーペアを Android キーストアにインポートするには、 Builder を使用してこのクラスのインスタンスを作成し、インポートするキーまたはキーペアを使用してインスタンスを java.security.KeyStore#setEntry(String, java.security.KeyStore.Entry, ProtectionParameter) KeyStore.setEntry に渡します。
Android キーストアからシークレット/対称キーまたは秘密キーを取得するには、 java.security.KeyStore#getKey(String, char[]) KeyStore.getKey(String, null) または java.security.KeyStore#getEntry(String, java.security.KeyStore.ProtectionParameter) KeyStore.getEntry(String, null)を使用します。 Android キーストアから公開キーを取得するには、 java.security.KeyStore#getCertificate(String) を使用してから Certificate#getPublicKey()します。
Android キーストアに格納されているキー ペアのアルゴリズム固有の公開パラメーターを取得するために、秘密キーは java.security.interfaces.ECKey または java.security.interfaces.RSAKey インターフェイスを実装しますが、公開キーは java.security.interfaces.ECPublicKey または java.security.interfaces.RSAPublicKey インターフェイスを実装します。
注: Android キーストアに格納されているキーのキー マテリアルにはアクセスできません。
このクラスのインスタンスは不変です。
<h3>Known の問題</h3> Android 6.0 (API レベル 23) の既知のバグにより、公開キーに対してもユーザー認証関連の承認が適用されます。 この問題を回避するには、Android キーストアの外部で使用する公開キーマテリアルを抽出します。 例えば次が挙げられます。
{@code
PublicKey unrestrictedPublicKey =
KeyFactory.getInstance(publicKey.getAlgorithm()).generatePublic(
new X509EncodedKeySpec(publicKey.getEncoded()));
}
<h3>Example: GCM モードでの暗号化/復号化のための AES キー</h3> この例では、エイリアスの下で Android KeyStore に AES キーをインポートする方法を示 key1 、パディングなしで GCM モードでの暗号化/復号化にのみ使用することが許可されています。 キーは、Key#getEncoded()形式でRAWを介してキー マテリアルをエクスポートする必要があります。
{@code
SecretKey key = ...; // AES key
KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
keyStore.load(null);
keyStore.setEntry(
"key1",
new KeyStore.SecretKeyEntry(key),
new KeyProtection.Builder(KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
.setBlockMode(KeyProperties.BLOCK_MODE_GCM)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
.build());
// Key imported, obtain a reference to it.
SecretKey keyStoreKey = (SecretKey) keyStore.getKey("key1", null);
// The original key can now be discarded.
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, keyStoreKey);
...
}
<h3>Example: SHA-512</h3 を使用して MAC を生成するための HMAC キー> この例では、SHA-512 ダイジェストを使用して MAC を生成する場合にのみ使用することが許可 key1 エイリアスで Android KeyStore に HMAC キーをインポートする方法を示します。 キーは、Key#getEncoded()形式でRAWを介してキー マテリアルをエクスポートする必要があります。
{@code
SecretKey key = ...; // HMAC key of algorithm "HmacSHA512".
KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
keyStore.load(null);
keyStore.setEntry(
"key1",
new KeyStore.SecretKeyEntry(key),
new KeyProtection.Builder(KeyProperties.PURPOSE_SIGN).build());
// Key imported, obtain a reference to it.
SecretKey keyStoreKey = (SecretKey) keyStore.getKey("key1", null);
// The original key can now be discarded.
Mac mac = Mac.getInstance("HmacSHA512");
mac.init(keyStoreKey);
...
}
<h3>Example: ECDSA を使用した署名/検証のための EC キー ペア</h3> この例では、SHA-256 または SHA-512 ダイジェストでの署名にのみ使用する秘密キーを使用して、エイリアス key2 の下で、EC キー ペアを Android KeyStore にインポートする方法を示します。 公開キーの使用は無制限です。 秘密キーと公開キーの両方が、Key#getEncoded()形式とPKCS#8形式でX.509を介してキー マテリアルをエクスポートする必要があります。
{@code
PrivateKey privateKey = ...; // EC private key
Certificate[] certChain = ...; // Certificate chain with the first certificate
// containing the corresponding EC public key.
KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
keyStore.load(null);
keyStore.setEntry(
"key2",
new KeyStore.PrivateKeyEntry(privateKey, certChain),
new KeyProtection.Builder(KeyProperties.PURPOSE_SIGN)
.setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512)
.build());
// Key pair imported, obtain a reference to it.
PrivateKey keyStorePrivateKey = (PrivateKey) keyStore.getKey("key2", null);
PublicKey publicKey = keyStore.getCertificate("key2").getPublicKey();
// The original private key can now be discarded.
Signature signature = Signature.getInstance("SHA256withECDSA");
signature.initSign(keyStorePrivateKey);
...
}
<h3>Example: PKCS#1 パディングを使用した署名/検証用の RSA キー ペア</h3> この例では、SHA-256 ダイジェストを使用して PKCS#1 署名パディング スキームを使用する場合にのみ使用することが承認された秘密キーを使用して、エイリアス key2 の下で、ユーザーが過去 10 分以内に認証された場合にのみ、RSA キー ペアを Android KeyStore にインポートする方法を示します。 公開キーの使用は無制限です (既知の問題を参照)。 秘密キーと公開キーの両方が、Key#getEncoded()形式とPKCS#8形式でX.509を介してキー マテリアルをエクスポートする必要があります。
{@code
PrivateKey privateKey = ...; // RSA private key
Certificate[] certChain = ...; // Certificate chain with the first certificate
// containing the corresponding RSA public key.
KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
keyStore.load(null);
keyStore.setEntry(
"key2",
new KeyStore.PrivateKeyEntry(privateKey, certChain),
new KeyProtection.Builder(KeyProperties.PURPOSE_SIGN)
.setDigests(KeyProperties.DIGEST_SHA256)
.setSignaturePaddings(KeyProperties.SIGNATURE_PADDING_RSA_PKCS1)
// Only permit this key to be used if the user
// authenticated within the last ten minutes.
.setUserAuthenticationRequired(true)
.setUserAuthenticationValidityDurationSeconds(10 * 60)
.build());
// Key pair imported, obtain a reference to it.
PrivateKey keyStorePrivateKey = (PrivateKey) keyStore.getKey("key2", null);
PublicKey publicKey = keyStore.getCertificate("key2").getPublicKey();
// The original private key can now be discarded.
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initSign(keyStorePrivateKey);
...
}
<h3>Example: PKCS#1 パディングを使用した暗号化/復号化のための RSA キー ペア</h3> この例では、PKCS#1 暗号化パディング スキームを使用した暗号化解除にのみ使用する秘密キーを使用して、エイリアス key2 の下の Android KeyStore に RSA キー ペアをインポートする方法を示します。 公開キーの使用は無制限であるため、埋め込みスキームとダイジェストを使用した暗号化が許可されます。 秘密キーと公開キーの両方が、Key#getEncoded()形式とPKCS#8形式でX.509を介してキー マテリアルをエクスポートする必要があります。
{@code
PrivateKey privateKey = ...; // RSA private key
Certificate[] certChain = ...; // Certificate chain with the first certificate
// containing the corresponding RSA public key.
KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
keyStore.load(null);
keyStore.setEntry(
"key2",
new KeyStore.PrivateKeyEntry(privateKey, certChain),
new KeyProtection.Builder(KeyProperties.PURPOSE_DECRYPT)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1)
.build());
// Key pair imported, obtain a reference to it.
PrivateKey keyStorePrivateKey = (PrivateKey) keyStore.getKey("key2", null);
PublicKey publicKey = keyStore.getCertificate("key2").getPublicKey();
// The original private key can now be discarded.
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.DECRYPT_MODE, keyStorePrivateKey);
...
}
このページの一部は、によって作成および共有され、に記載されている条件に従って使用される作業に基づく変更です。
プロパティ
| 名前 | 説明 |
|---|---|
| Class |
この |
| Handle |
基になる Android インスタンスへのハンドル。 (継承元 Object) |
| IsDigestsSpecified |
キーを使用できるダイジェスト アルゴリズムのセットが指定されている場合は、 |
| IsInvalidatedByBiometricEnrollment |
新しい生体認証が登録されたとき、または登録されているすべての生体認証が削除されたときに、キーが元に戻せないほど無効になった場合に |
| IsMgf1DigestsSpecified |
キーを使用できる MGF1 マスク生成関数のダイジェストセットが指定されている場合は、 |
| IsRandomizedEncryptionRequired |
毎回同じプレーンテキストに対して異なる暗号テキストを生成するために、このキーを使用した暗号化を十分にランダム化する必要がある場合に、 |
| IsUnlockedDeviceRequired |
デバイスのロックが解除されている間にのみキーを使用することが承認されている場合は、 |
| IsUserAuthenticationRequired |
ユーザーが認証されている場合にのみキーの使用が承認されている場合は、 |
| IsUserAuthenticationValidWhileOnBody |
デバイスがユーザーの本文から削除されたときにキーが承認解除されるかどうかを |
| IsUserConfirmationRequired |
ユーザーが確認したメッセージにのみキーを使用することが承認されている場合は、 |
| IsUserPresenceRequired |
|
| JniIdentityHashCode |
相互運用ランタイムによってこのJava ピアに割り当てられた ID ハッシュ コードを取得します。 (継承元 Object) |
| JniManagedPeerState |
Android キーストア システムにインポートするときにキーまたはキー ペアをセキュリティで保護する方法の指定。 (継承元 JavaObject) |
| JniPeerMembers |
Android キーストア システムにインポートするときにキーまたはキー ペアをセキュリティで保護する方法の指定。 |
| KeyValidityForConsumptionEnd |
キーが復号化と検証に対して長く有効でない時間を取得します。 |
| KeyValidityForOriginationEnd |
キーが暗号化と署名に対して長く有効でない時間を取得します。 |
| KeyValidityStart |
キーがまだ有効でない時間を取得します。 |
| MaxUsageCount |
制限付き使用キーの使用が許可される最大回数を返します。キーを使用できる回数に制限がない場合は |
| Mgf1Digests |
MGF1 マスク生成関数で使用できるダイジェストのセットを返します (例: |
| PeerReference |
このJava ピアの JNI オブジェクト参照を取得します。 (継承元 Object) |
| Purposes |
目的のセットを取得します (例: |
| ThresholdClass |
この API は Android 用 Mono インフラストラクチャをサポートしており、コードから直接使用するためのものではありません。 (継承元 Object) |
| ThresholdType |
この API は Android 用 Mono インフラストラクチャをサポートしており、コードから直接使用するためのものではありません。 (継承元 Object) |
| UserAuthenticationType |
Android キーストア システムにインポートするときにキーまたはキー ペアをセキュリティで保護する方法の指定。 |
| UserAuthenticationValidityDurationSeconds |
ユーザーが正常に認証された後に、このキーの使用が承認されている期間 (秒) を取得します。 |
メソッド
| 名前 | 説明 |
|---|---|
| Clone() |
このオブジェクトのコピーを作成して返します。 (継承元 Object) |
| Construct(JniObjectReference, JniObjectReferenceOptions) |
Android キーストア システムにインポートするときにキーまたはキー ペアをセキュリティで保護する方法の指定。 (継承元 JavaObject) |
| Dispose() |
このJava ピアによって保持されているリソースを解放します。 (継承元 Object) |
| Dispose(Boolean) |
このJava ピアによって保持されているリソースを解放します。 (継承元 Object) |
| DisposeUnlessReferenced() |
Android キーストア システムにインポートするときにキーまたはキー ペアをセキュリティで保護する方法の指定。 (継承元 JavaObject) |
| Equals(Object) |
Android キーストア システムにインポートするときにキーまたはキー ペアをセキュリティで保護する方法の指定。 (継承元 JavaObject) |
| Equals(Object) |
他のオブジェクトがこのオブジェクトと "等しい" かどうかを示します。 (継承元 Object) |
| GetBlockModes() |
ブロック モードのセットを取得します (e. |
| GetDigests() |
ダイジェスト アルゴリズムのセットを取得します (例: |
| GetEncryptionPaddings() |
埋め込みスキームのセットを取得します (e. |
| GetHashCode() |
オブジェクトのハッシュ コード値を返します。 (継承元 Object) |
| GetSignaturePaddings() |
埋め込みスキームのセットを取得します (e. |
| JavaFinalize() |
オブジェクトへの参照がなくなったとガベージ コレクションによって判断されたときに、オブジェクトのガベージ コレクターによって呼び出されます。 (継承元 Object) |
| Notify() |
このオブジェクトのモニターで待機している 1 つのスレッドを起動します。 (継承元 Object) |
| NotifyAll() |
このオブジェクトのモニターで待機しているすべてのスレッドを起動します。 (継承元 Object) |
| SetHandle(IntPtr, JniHandleOwnership) |
Handle プロパティを設定します。 (継承元 Object) |
| SetPeerReference(JniObjectReference, JniObjectReferenceOptions) |
Android キーストア システムにインポートするときにキーまたはキー ペアをセキュリティで保護する方法の指定。 (継承元 JavaObject) |
| ToArray<T>() |
このJava配列ラッパーからマネージド配列を作成します。 (継承元 Object) |
| ToString() |
オブジェクトの文字列表現を返します。 (継承元 Object) |
| UnregisterFromRuntime() |
相互運用ランタイムからこのJava ピアの登録を解除します。 (継承元 Object) |
| Wait() |
現在のスレッドが起動するまで待機します。通常は、 <em>notified</em> または <em>interrupted</em>。 (継承元 Object) |
| Wait(Int64, Int32) |
現在のスレッドは、通常、 <em>notified</em> または <em>interrupted</em>、または一定のリアルタイムが経過するまで、起動されるまで待機します。 (継承元 Object) |
| Wait(Int64) |
現在のスレッドは、通常、 <em>notified</em> または <em>interrupted</em>、または一定のリアルタイムが経過するまで、起動されるまで待機します。 (継承元 Object) |
明示的なインターフェイスの実装
| 名前 | 説明 |
|---|---|
| IJavaPeerable.Disposed() |
Android キーストア システムにインポートするときにキーまたはキー ペアをセキュリティで保護する方法の指定。 (継承元 JavaObject) |
| IJavaPeerable.Finalized() |
Android キーストア システムにインポートするときにキーまたはキー ペアをセキュリティで保護する方法の指定。 (継承元 JavaObject) |
| IJavaPeerable.JniObjectReferenceControlBlock |
Android キーストア システムにインポートするときにキーまたはキー ペアをセキュリティで保護する方法の指定。 (継承元 JavaObject) |
| IJavaPeerable.SetJniIdentityHashCode(Int32) |
Android キーストア システムにインポートするときにキーまたはキー ペアをセキュリティで保護する方法の指定。 (継承元 JavaObject) |
| IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
Android キーストア システムにインポートするときにキーまたはキー ペアをセキュリティで保護する方法の指定。 (継承元 JavaObject) |
| IJavaPeerable.SetPeerReference(JniObjectReference) |
Android キーストア システムにインポートするときにキーまたはキー ペアをセキュリティで保護する方法の指定。 (継承元 JavaObject) |
| IJavaPeerable.UnregisterFromRuntime() |
Android キーストア システムにインポートするときにキーまたはキー ペアをセキュリティで保護する方法の指定。 |
拡張メソッド
| 名前 | 説明 |
|---|---|
| GetJniTypeName(IJavaPeerable) |
インスタンス |
| JavaAs<TResult>(IJavaPeerable) |
|
| JavaCast<TResult>(IJavaObject) |
Android ランタイムチェック型変換を実行します。 |
| JavaCast<TResult>(IJavaObject) |
Android キーストア システムにインポートするときにキーまたはキー ペアをセキュリティで保護する方法の指定。 |
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
|