KeyProtection クラス

定義

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
継承
KeyProtection
属性
実装

注釈

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);
            ...
            }

Javaドキュメント。

このページの一部は、によって作成および共有され、に記載されている条件に従って使用される作業に基づく変更です。

プロパティ

名前 説明
Class

この Objectのランタイム クラスを返します。

(継承元 Object)
Handle

基になる Android インスタンスへのハンドル。

(継承元 Object)
IsDigestsSpecified

キーを使用できるダイジェスト アルゴリズムのセットが指定されている場合は、 true を返します。

IsInvalidatedByBiometricEnrollment

新しい生体認証が登録されたとき、または登録されているすべての生体認証が削除されたときに、キーが元に戻せないほど無効になった場合に true を返します。

IsMgf1DigestsSpecified

キーを使用できる MGF1 マスク生成関数のダイジェストセットが指定されている場合は、 true を返します。

IsRandomizedEncryptionRequired

毎回同じプレーンテキストに対して異なる暗号テキストを生成するために、このキーを使用した暗号化を十分にランダム化する必要がある場合に、 true を返します。

IsUnlockedDeviceRequired

デバイスのロックが解除されている間にのみキーを使用することが承認されている場合は、 true を返します。

IsUserAuthenticationRequired

ユーザーが認証されている場合にのみキーの使用が承認されている場合は、 true を返します。

IsUserAuthenticationValidWhileOnBody

デバイスがユーザーの本文から削除されたときにキーが承認解除されるかどうかを true 返します。

IsUserConfirmationRequired

ユーザーが確認したメッセージにのみキーを使用することが承認されている場合は、 true を返します。

IsUserPresenceRequired

true呼び出しとSignature.initSign()呼び出しの間でユーザープレゼンスのテストが実行された場合にのみ、キーの使用が承認されている場合にSignature.sign()を返します。

JniIdentityHashCode

相互運用ランタイムによってこのJava ピアに割り当てられた ID ハッシュ コードを取得します。

(継承元 Object)
JniManagedPeerState

Android キーストア システムにインポートするときにキーまたはキー ペアをセキュリティで保護する方法の指定。

(継承元 JavaObject)
JniPeerMembers

Android キーストア システムにインポートするときにキーまたはキー ペアをセキュリティで保護する方法の指定。

KeyValidityForConsumptionEnd

キーが復号化と検証に対して長く有効でない時間を取得します。

KeyValidityForOriginationEnd

キーが暗号化と署名に対して長く有効でない時間を取得します。

KeyValidityStart

キーがまだ有効でない時間を取得します。

MaxUsageCount

制限付き使用キーの使用が許可される最大回数を返します。キーを使用できる回数に制限がない場合は KeyProperties#UNRESTRICTED_USAGE_COUNT します。

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)

インスタンス selfの型の JNI 名を取得します。

JavaAs<TResult>(IJavaPeerable)

selfを強制的にTResult入力し、強制型がJava側で有効であることを確認します。

JavaCast<TResult>(IJavaObject)

Android ランタイムチェック型変換を実行します。

JavaCast<TResult>(IJavaObject)

Android キーストア システムにインポートするときにキーまたはキー ペアをセキュリティで保護する方法の指定。

TryJavaCast<TResult>(IJavaPeerable, TResult)

selfを強制的にTResult入力し、強制型がJava側で有効であることを確認します。

適用対象