KeyGenParameterSpec クラス
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
[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
- 継承
- 属性
- 実装
注釈
AlgorithmParameterSpec
KeyPairGeneratorのKeyGeneratorまたはを初期化する場合。 この仕様では、キーの使用にユーザー認証が必要かどうか、承認される操作 (署名、暗号化解除など)、パラメーター (特定の埋め込みスキームまたはダイジェストのみなど)、キーの有効期間の開始日と終了日など、キーの承認された使用方法が決定されます。 仕様で表されるキー使用承認は、秘密鍵と秘密キーにのみ適用されます。公開キーは、サポートされている操作に使用できます。
非対称キー ペアまたは対称キーを生成するには、Builderを使用してこのクラスのインスタンスを作成し、KeyPairGenerator インスタンスでKeyGenerator プロバイダーから目的のキーの種類 (ECやAESKeyPropertiesなど) の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);
}
このページの一部は、によって作成および共有され、に記載されている条件に従って使用される作業に基づく変更です。
プロパティ
| 名前 | 説明 |
|---|---|
| AlgorithmParameterSpec |
キーの作成に使用されるキー アルゴリズム固有の |
| AttestKeyAlias |
生成されたキーの構成証明証明書の署名に使用される構成証明キーのエイリアスを返します。 |
| CertificateNotAfter |
X で使用する終了日を返します。 |
| CertificateNotBefore |
X で使用する開始日を返します。 |
| CertificateSerialNumber |
X で使用するシリアル番号を返します。 |
| CertificateSubject |
X で使用するサブジェクト識別名を返します。 |
| Class |
この |
| Handle |
基になる Android インスタンスへのハンドル。 (継承元 Object) |
| IsDevicePropertiesAttestationIncluded |
基本デバイスプロパティ ( |
| IsDigestsSpecified |
キーを使用できるダイジェスト アルゴリズムのセットが指定されている場合は、 |
| IsInvalidatedByBiometricEnrollment |
新しい生体認証が登録されたとき、または登録されているすべての生体認証が削除されたときに、キーが元に戻せないほど無効になった場合に |
| IsMgf1DigestsSpecified |
キーを使用できる MGF1 マスク生成関数のダイジェストセットが指定されている場合は、 |
| IsRandomizedEncryptionRequired |
毎回同じプレーンテキストに対して異なる暗号テキストを生成するために、このキーを使用した暗号化を十分にランダム化する必要がある場合に、 |
| IsStrongBoxBacked |
キーが Strongbox セキュリティ チップによって保護されている場合に |
| IsUnlockedDeviceRequired |
デバイスのロックが解除されている間にのみキーを使用することが承認されている場合は、 |
| IsUserAuthenticationRequired |
ユーザーが認証されている場合にのみキーの使用が承認されている場合は、 |
| IsUserAuthenticationValidWhileOnBody |
有効期間まで、デバイスがユーザーの本文から削除されるまで、キーが承認された状態を維持する場合は、 |
| IsUserConfirmationRequired |
ユーザーが確認したメッセージにのみキーを使用することが承認されている場合は、 |
| IsUserPresenceRequired |
|
| JniIdentityHashCode |
相互運用ランタイムによってこのJava ピアに割り当てられた ID ハッシュ コードを取得します。 (継承元 Object) |
| JniPeerMembers |
|
| KeySize |
要求されたキー サイズを返します。 |
| KeystoreAlias |
|
| KeyValidityForConsumptionEnd |
キーが復号化と検証に対して有効でなくなった時間を返します。制限されていない場合は |
| KeyValidityForOriginationEnd |
キーが暗号化と署名に対して有効でなくなった時間を返します。制限されていない場合は |
| KeyValidityStart |
キーがまだ有効でない時間を返します。制限されていない場合は |
| MaxUsageCount |
制限付き使用キーの使用が許可される最大回数を返します。キーを使用できる回数に制限がない場合は |
| 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) |
インスタンス |
| JavaAs<TResult>(IJavaPeerable) |
|
| JavaCast<TResult>(IJavaObject) |
Android ランタイムチェック型変換を実行します。 |
| JavaCast<TResult>(IJavaObject) |
|
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
|