KeyGenParameterSpec クラス

定義

AlgorithmParameterSpec KeyPairGeneratorKeyGeneratorまたはを初期化する場合。

[Android.Runtime.Register("android/security/keystore/KeyGenParameterSpec", ApiSince=23, DoNotGenerateAcw=true)]
public sealed class KeyGenParameterSpec : Java.Lang.Object, IDisposable, Java.Interop.IJavaPeerable, Java.Security.Spec.IAlgorithmParameterSpec
[<Android.Runtime.Register("android/security/keystore/KeyGenParameterSpec", ApiSince=23, DoNotGenerateAcw=true)>]
type KeyGenParameterSpec = class
    inherit Object
    interface IAlgorithmParameterSpec
    interface IJavaObject
    interface IDisposable
    interface IJavaPeerable
継承
KeyGenParameterSpec
属性
実装

注釈

AlgorithmParameterSpec KeyPairGeneratorKeyGeneratorまたはを初期化する場合。 この仕様では、キーの使用にユーザー認証が必要かどうか、承認される操作 (署名、暗号化解除など)、パラメーター (特定の埋め込みスキームまたはダイジェストのみなど)、キーの有効期間の開始日と終了日など、キーの承認された使用方法が決定されます。 仕様で表されるキー使用承認は、秘密鍵と秘密キーにのみ適用されます。公開キーは、サポートされている操作に使用できます。

非対称キー ペアまたは対称キーを生成するには、Builderを使用してこのクラスのインスタンスを作成し、KeyPairGenerator インスタンスでKeyGenerator プロバイダーから目的のキーの種類 (ECAESKeyPropertiesなど) のKEY_ALGORITHMAndroidKeyStoreまたはKeyGenParameterSpecを初期化してから、KeyGenerator#generateKey()またはKeyPairGenerator#generateKeyPair()を使用してキーまたはキー ペアを生成します。

生成されたキー ペアまたはキーはジェネレーターによって返され、この仕様で指定されたエイリアスの下の Android キーストアにも格納されます。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 インターフェイスを実装します。

非対称キー ペアの場合、X.509 証明書も生成され、Android キーストアに格納されます。 これは、 java.security.KeyStore 抽象化では、証明書のないキー ペアの格納がサポートされていないためです。 証明書のサブジェクト、シリアル番号、および有効性の日付は、この仕様でカスタマイズできます。証明書は、後で証明機関 (CA) によって署名された証明書に置き換えることができます。

注: Builder#setAttestationChallenge(byte[])を使用して構成証明が要求されない場合は、生成された証明書が自己署名されている可能性があります。 秘密キーが証明書に署名する権限がない場合、証明書は検証されない無効な署名で作成されます。 このような証明書は、公開キーへのアクセスを提供するため、引き続き役立ちます。 証明書の有効な署名を生成するには、 <ul><li>KeyProperties#PURPOSE_SIGN、</li><li>ユーザーの認証 ( Builder#setUserAuthenticationRequired(boolean)参照)、</li を参照><操作のすべてのキーを承認する必要があります。 >現時点での署名/配信 ( Builder#setKeyValidityStart(Date)Builder#setKeyValidityForOriginationEnd(Date)を参照)、</li><li>適したダイジェスト、</li><li>(RSA キーのみ) パディング スキーム KeyProperties#SIGNATURE_PADDING_RSA_PKCS1.</li></ul>

注: 生成された対称キーと秘密キーのキー マテリアルにはアクセスできません。 公開キーのキー マテリアルにアクセスできます。

このクラスのインスタンスは不変です。

<h3>Known の問題</h3> Android 6.0 (API レベル 23) の既知のバグにより、公開キーに対してもユーザー認証関連の承認が適用されます。 この問題を回避するには、Android キーストアの外部で使用する公開キーマテリアルを抽出します。 例えば次が挙げられます。

{@code
            PublicKey unrestrictedPublicKey =
                    KeyFactory.getInstance(publicKey.getAlgorithm()).generatePublic(
                            new X509EncodedKeySpec(publicKey.getEncoded()));
            }

<h3>Example: ECDSA を使用した署名/検証のための NIST P-256 EC キー ペア</h3> この例は、NIST P-256 (別名) を生成する方法を示しています secp256r1 aka prime256v1) エイリアス下の Android KeyStore システムの EC キー ペア key1 、SHA-256、SHA-384 を使用した署名にのみ秘密キーを使用することが承認されています。 または SHA-512 ダイジェスト。ユーザーが過去 5 分以内に認証された場合に限られます。 公開キーの使用は無制限です (既知の問題を参照)。

{@code
            KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(
                    KeyProperties.KEY_ALGORITHM_EC, "AndroidKeyStore");
            keyPairGenerator.initialize(
                    new KeyGenParameterSpec.Builder(
                            "key1",
                            KeyProperties.PURPOSE_SIGN)
                            .setAlgorithmParameterSpec(new ECGenParameterSpec("secp256r1"))
                            .setDigests(KeyProperties.DIGEST_SHA256,
                                    KeyProperties.DIGEST_SHA384,
                                    KeyProperties.DIGEST_SHA512)
                            // Only permit the private key to be used if the user authenticated
                            // within the last five minutes.
                            .setUserAuthenticationRequired(true)
                            .setUserAuthenticationValidityDurationSeconds(5 * 60)
                            .build());
            KeyPair keyPair = keyPairGenerator.generateKeyPair();
            Signature signature = Signature.getInstance("SHA256withECDSA");
            signature.initSign(keyPair.getPrivate());
            ...

            // The key pair can also be obtained from the Android Keystore any time as follows:
            KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
            keyStore.load(null);
            PrivateKey privateKey = (PrivateKey) keyStore.getKey("key1", null);
            PublicKey publicKey = keyStore.getCertificate("key1").getPublicKey();
            }

<h3>Example: RSA-PSS を使用した署名/検証のための RSA キー ペア</h3> この例では、SHA-256 または SHA-512 ダイジェストで RSA-PSS 署名埋め込みスキームを使用した署名にのみ使用 key1 エイリアスの下で、Android KeyStore システムで RSA キー ペアを生成する方法を示します。 公開キーの使用は無制限です。

{@code
            KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(
                    KeyProperties.KEY_ALGORITHM_RSA, "AndroidKeyStore");
            keyPairGenerator.initialize(
                    new KeyGenParameterSpec.Builder(
                            "key1",
                            KeyProperties.PURPOSE_SIGN)
                            .setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512)
                            .setSignaturePaddings(KeyProperties.SIGNATURE_PADDING_RSA_PSS)
                            .build());
            KeyPair keyPair = keyPairGenerator.generateKeyPair();
            Signature signature = Signature.getInstance("SHA256withRSA/PSS");
            signature.initSign(keyPair.getPrivate());
            ...

            // The key pair can also be obtained from the Android Keystore any time as follows:
            KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
            keyStore.load(null);
            PrivateKey privateKey = (PrivateKey) keyStore.getKey("key1", null);
            PublicKey publicKey = keyStore.getCertificate("key1").getPublicKey();
            }

<h3>Example: RSA OAEP を使用した暗号化/暗号化解除のための RSA キー ペア</h3> この例では、エイリアス key1 で Android KeyStore システムで RSA キー ペアを生成する方法を示します。この例では、SHA-256 または SHA-512 ダイジェストを使用した RSA OAEP 暗号化パディング スキームを使用した暗号化解除にのみ秘密キーを使用することが承認されています。 公開キーの使用は無制限です。

{@code
            KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(
                    KeyProperties.KEY_ALGORITHM_RSA, "AndroidKeyStore");
            keyPairGenerator.initialize(
                    new KeyGenParameterSpec.Builder(
                            "key1",
                            KeyProperties.PURPOSE_DECRYPT)
                            .setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512)
                            .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_OAEP)
                            .build());
            KeyPair keyPair = keyPairGenerator.generateKeyPair();
            Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
            cipher.init(Cipher.DECRYPT_MODE, keyPair.getPrivate());
            ...

            // The key pair can also be obtained from the Android Keystore any time as follows:
            KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
            keyStore.load(null);
            PrivateKey privateKey = (PrivateKey) keyStore.getKey("key1", null);
            PublicKey publicKey = keyStore.getCertificate("key1").getPublicKey();
            }

<h3>Example: GCM モードでの暗号化/暗号化解除のための AES キー</h3> 次の例では、エイリアスの下で Android KeyStore システムで AES キーを生成 key2 、パディングなしで GCM モードでの暗号化/復号化にのみ使用する権限を持つ方法を示します。

{@code
            KeyGenerator keyGenerator = KeyGenerator.getInstance(
                    KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore");
            keyGenerator.init(
                    new KeyGenParameterSpec.Builder("key2",
                            KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
                            .setBlockModes(KeyProperties.BLOCK_MODE_GCM)
                            .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
                            .build());
            SecretKey key = keyGenerator.generateKey();

            Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
            cipher.init(Cipher.ENCRYPT_MODE, key);
            ...

            // The key can also be obtained from the Android Keystore any time as follows:
            KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
            keyStore.load(null);
            key = (SecretKey) keyStore.getKey("key2", null);
            }

<h3>Example: SHA-256 を使用して MAC を生成するための HMAC キー</h3> この例では、SHA-256 を使用して HMAC を生成するためにのみ使用 key2 エイリアスで Android KeyStore システムで HMAC キーを生成する方法を示します。

{@code
            KeyGenerator keyGenerator = KeyGenerator.getInstance(
                    KeyProperties.KEY_ALGORITHM_HMAC_SHA256, "AndroidKeyStore");
            keyGenerator.init(
                    new KeyGenParameterSpec.Builder("key2", KeyProperties.PURPOSE_SIGN).build());
            SecretKey key = keyGenerator.generateKey();
            Mac mac = Mac.getInstance("HmacSHA256");
            mac.init(key);
            ...

            // The key can also be obtained from the Android Keystore any time as follows:
            KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
            keyStore.load(null);
            key = (SecretKey) keyStore.getKey("key2", null);
            }

<h3 id="example:ecdh">Example: ECDH キー アグリーメントの EC キー</h3> この例では、ECDH キー アグリーメントを使用して他のパーティとの共有シークレットを確立するために使用される楕円曲線キー ペアを生成する方法を示します。

{@code
            KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(
                    KeyProperties.KEY_ALGORITHM_EC, "AndroidKeyStore");
            keyPairGenerator.initialize(
                    new KeyGenParameterSpec.Builder(
                        "eckeypair",
                        KeyProperties.PURPOSE_AGREE_KEY)
                        .setAlgorithmParameterSpec(new ECGenParameterSpec("secp256r1"))
                        .build());
            KeyPair myKeyPair = keyPairGenerator.generateKeyPair();

            // Exchange public keys with server. A new ephemeral key MUST be used for every message.
            PublicKey serverEphemeralPublicKey; // Ephemeral key received from server.

            // Create a shared secret based on our private key and the other party's public key.
            KeyAgreement keyAgreement = KeyAgreement.getInstance("ECDH", "AndroidKeyStore");
            keyAgreement.init(myKeyPair.getPrivate());
            keyAgreement.doPhase(serverEphemeralPublicKey, true);
            byte[] sharedSecret = keyAgreement.generateSecret();

            // sharedSecret cannot safely be used as a key yet. We must run it through a key derivation
            // function with some other data: "salt" and "info". Salt is an optional random value,
            // omitted in this example. It's good practice to include both public keys and any other
            // key negotiation data in info. Here we use the public keys and a label that indicates
            // messages encrypted with this key are coming from the server.
            byte[] salt = {};
            ByteArrayOutputStream info = new ByteArrayOutputStream();
            info.write("ECDH secp256r1 AES-256-GCM-SIV\0".getBytes(StandardCharsets.UTF_8));
            info.write(myKeyPair.getPublic().getEncoded());
            info.write(serverEphemeralPublicKey.getEncoded());

            // This example uses the Tink library and the HKDF key derivation function.
            AesGcmSiv key = new AesGcmSiv(Hkdf.computeHkdf(
                    "HMACSHA256", sharedSecret, salt, info.toByteArray(), 32));
            byte[] associatedData = {};
            return key.decrypt(ciphertext, associatedData);
            }

Javaドキュメント。

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

プロパティ

名前 説明
AlgorithmParameterSpec

キーの作成に使用されるキー アルゴリズム固有の AlgorithmParameterSpec を返します。アルゴリズム固有の既定値を使用する必要がある場合は null します。

AttestKeyAlias

生成されたキーの構成証明証明書の署名に使用される構成証明キーのエイリアスを返します。

CertificateNotAfter

X で使用する終了日を返します。

CertificateNotBefore

X で使用する開始日を返します。

CertificateSerialNumber

X で使用するシリアル番号を返します。

CertificateSubject

X で使用するサブジェクト識別名を返します。

Class

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

(継承元 Object)
Handle

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

(継承元 Object)
IsDevicePropertiesAttestationIncluded

基本デバイスプロパティ (trueBuild#BRANDBuild#DEVICEBuild#MANUFACTURERBuild#MODEL) の構成証明が、生成されたキーの構成証明証明書に追加されるように要求された場合に、Build#PRODUCTを返します。

IsDigestsSpecified

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

IsInvalidatedByBiometricEnrollment

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

IsMgf1DigestsSpecified

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

IsRandomizedEncryptionRequired

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

IsStrongBoxBacked

キーが Strongbox セキュリティ チップによって保護されている場合に true を返します。

IsUnlockedDeviceRequired

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

IsUserAuthenticationRequired

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

IsUserAuthenticationValidWhileOnBody

有効期間まで、デバイスがユーザーの本文から削除されるまで、キーが承認された状態を維持する場合は、 true を返します。

IsUserConfirmationRequired

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

IsUserPresenceRequired

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

JniIdentityHashCode

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

(継承元 Object)
JniPeerMembers

AlgorithmParameterSpec KeyPairGeneratorKeyGeneratorまたはを初期化する場合。

KeySize

要求されたキー サイズを返します。

KeystoreAlias

java.security.KeyStoreと組み合わせてAndroidKeyStoreで使用されるエイリアスを返します。

KeyValidityForConsumptionEnd

キーが復号化と検証に対して有効でなくなった時間を返します。制限されていない場合は null

KeyValidityForOriginationEnd

キーが暗号化と署名に対して有効でなくなった時間を返します。制限されていない場合は null

KeyValidityStart

キーがまだ有効でない時間を返します。制限されていない場合は null

MaxUsageCount

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

Mgf1Digests

MGF1 マスク生成関数で使用できるダイジェストのセットを返します (例:

PeerReference

このJava ピアの JNI オブジェクト参照を取得します。

(継承元 Object)
Purposes

目的のセットを返します (e.

ThresholdClass

この API は Android 用 Mono インフラストラクチャをサポートしており、コードから直接使用するためのものではありません。

(継承元 Object)
ThresholdType

この API は Android 用 Mono インフラストラクチャをサポートしており、コードから直接使用するためのものではありません。

(継承元 Object)
UserAuthenticationType

このキーの使用を承認できる認証モードを取得します。

UserAuthenticationValidityDurationSeconds

ユーザーが正常に認証された後に、このキーの使用が承認されている期間 (秒) を取得します。

メソッド

名前 説明
Clone()

このオブジェクトのコピーを作成して返します。

(継承元 Object)
Dispose()

このJava ピアによって保持されているリソースを解放します。

(継承元 Object)
Dispose(Boolean)

このJava ピアによって保持されているリソースを解放します。

(継承元 Object)
Equals(Object)

他のオブジェクトがこのオブジェクトと "等しい" かどうかを示します。

(継承元 Object)
GetAttestationChallenge()

このキー ペアの構成証明証明書に配置される構成証明チャレンジ値を返します。

GetBlockModes()

ブロック モードのセットを取得します (e.

GetDigests()

ダイジェスト アルゴリズムのセットを返します (例:

GetEncryptionPaddings()

埋め込みスキームのセットを返します (e.

GetHashCode()

オブジェクトのハッシュ コード値を返します。

(継承元 Object)
GetSignaturePaddings()

埋め込みスキームのセットを取得します (e.

JavaFinalize()

オブジェクトへの参照がなくなったとガベージ コレクションによって判断されたときに、オブジェクトのガベージ コレクターによって呼び出されます。

(継承元 Object)
Notify()

このオブジェクトのモニターで待機している 1 つのスレッドを起動します。

(継承元 Object)
NotifyAll()

このオブジェクトのモニターで待機しているすべてのスレッドを起動します。

(継承元 Object)
SetHandle(IntPtr, JniHandleOwnership)

Handle プロパティを設定します。

(継承元 Object)
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()

このマネージド ピアが破棄されたことを相互運用ランタイムに通知します。

(継承元 Object)
IJavaPeerable.DisposeUnlessReferenced()

別のマネージド参照によって保持されない限り、このJavaピアを解放します。

(継承元 Object)
IJavaPeerable.Finalized()

このマネージド ピアが終了したことを相互運用ランタイムに通知します。

(継承元 Object)
IJavaPeerable.JniManagedPeerState

このマネージド ピアとその JNI 参照の間の関係を記述する状態を取得します。

(継承元 Object)
IJavaPeerable.SetJniIdentityHashCode(Int32)

このJava ピアの相互運用 ID ハッシュ コードを設定します。

(継承元 Object)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

このJava ピアのマネージド ピアと JNI ピアの状態を設定します。

(継承元 Object)
IJavaPeerable.SetPeerReference(JniObjectReference)

このマネージド ピアで使用される JNI オブジェクト参照を設定します。

(継承元 Object)

拡張メソッド

名前 説明
GetJniTypeName(IJavaPeerable)

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

JavaAs<TResult>(IJavaPeerable)

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

JavaCast<TResult>(IJavaObject)

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

JavaCast<TResult>(IJavaObject)

AlgorithmParameterSpec KeyPairGeneratorKeyGeneratorまたはを初期化する場合。

TryJavaCast<TResult>(IJavaPeerable, TResult)

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

適用対象