翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
Raw ECDHキーリング
Raw ECDHキーリングは、マテリアルプロバイダーライブラリのバージョン 1.5.0 でのみ使用できます。
Raw ECDHキーリングは、指定した楕円曲線のパブリック/プライベートキーペアを使用して、2 つの当事者間で共有ラッピングキーを取得します。まず、キーリングは、送信者のプライベートキー、受信者のパブリックキー、および楕円曲線 Diffie-Hellman (ECDH) キー契約アルゴリズムを使用して共有シークレットを取得します。次に、キーリングは共有シークレットを使用して、データ暗号化キーを保護する共有ラッピングキーを取得します。 AWS Database Encryption が (KDF_CTR_HMAC_SHA384
) SDKを使用して共有ラッピングキーを導出するキー導出関数は、NISTキー導出の推奨事項に準拠しています。
キー取得関数は、64 バイトのキーマテリアルを返します。両者が正しいキーマテリアルを使用するように、 AWS Database Encryption SDKは最初の 32 バイトをコミットメントキーとして使用し、最後の 32 バイトを共有ラッピングキーとして使用します。復号時に、キーリングが暗号化されたレコードのマテリアルの説明フィールドに保存されているのと同じコミットメントキーと共有ラッピングキーを再現できない場合、オペレーションは失敗します。例えば、Alice のプライベートキーと Bob のパブリックキーで設定されたキーリングを使用してレコードを暗号化する場合、Bob のプライベートキーと Alice のパブリックキーで設定されたキーリングは、同じコミットメントキーと共有ラッピングキーを再現し、レコードを復号化できます。Bob のパブリックキーが AWS KMS key ペアからのものである場合、Bob は AWS KMS ECDHキーリングを作成してレコードを復号できます。
Raw ECDHキーリングは、AES- を使用して対称キーでレコードを暗号化しますGCM。次に、データキーは、 AES- を使用して派生した共有ラッピングキーでエンベロープ暗号化されますGCM。各 Raw ECDHキーリングには共有ラッピングキーを 1 つだけ含めることができますが、複数の Raw ECDHキーリングを単独で、または他のキーリングとともにマルチキーリングに含めることができます。
プライベートキーの生成、保存、保護は、できればハードウェアセキュリティモジュール (HSM) またはキー管理システムで行います。送信者と受信者のキーペアは、ほぼ同じ楕円曲線上にあります。 AWS Database Encryption は、次の楕円キュブ仕様SDKをサポートしています。
ECC_NIST_P256
ECC_NIST_P384
ECC_NIST_P512
Raw ECDHキーリングの作成
Raw ECDHキーリングは、RawPrivateKeyToStaticPublicKey
、、EphemeralPrivateKeyToStaticPublicKey
および の 3 つのキーアグリーメントスキーマをサポートしますPublicKeyDiscovery
。選択したキーアグリーメントスキーマによって、実行できる暗号化オペレーションとキーマテリアルの組み立て方法が決まります。
RawPrivateKeyToStaticPublicKey
RawPrivateKeyToStaticPublicKey
キーアグリーメントスキーマを使用して、送信者のプライベートキーと受信者のパブリックキーをキーリングに静的に設定します。このキーアグリーメントスキーマは、レコードを暗号化および復号化できます。
ECDH キーアグリーメントスキーマを使用して Raw RawPrivateKeyToStaticPublicKey
キーリングを初期化するには、次の値を指定します。
-
送信者のプライベートキー
5958 で定義されているように、送信者の PEMエンコードされたプライベートキー (PKCS#8 PrivateKeyInfo structures) を指定する必要があります。 RFC
-
受信者のパブリックキー
5280 で定義されているように、受信者の DERでエンコードされた X.509 パブリックキーを指定する必要があります。これは SubjectPublicKeyInfo
(SPKI) とも呼ばれます。 RFC
非対称キー契約KMSキーペアのパブリックキー、または の外部で生成されたキーペアのパブリックキーを指定できます AWS。
-
曲線仕様
指定されたキーペアの楕円曲線仕様を識別します。送信者と受信者の両方のキーペアは、同じ曲線仕様である必要があります。
有効な値: ECC_NIST_P256
、ECC_NIS_P384
、ECC_NIST_P512
- C# / .NET
-
// Instantiate material providers
var materialProviders = new MaterialProviders(new MaterialProvidersConfig());
var BobPrivateKey = new MemoryStream(new byte[] { });
var AlicePublicKey = new MemoryStream(new byte[] { });
// Create the Raw ECDH static keyring
var staticConfiguration = new RawEcdhStaticConfigurations()
{
RawPrivateKeyToStaticPublicKey = new RawPrivateKeyToStaticPublicKeyInput
{
SenderStaticPrivateKey = BobPrivateKey,
RecipientPublicKey = AlicePublicKey
}
};
var createKeyringInput = new CreateRawEcdhKeyringInput()
{
CurveSpec = ECDHCurveSpec.ECC_NIST_P256
,
KeyAgreementScheme = staticConfiguration
};
var keyring = materialProviders.CreateRawEcdhKeyring(createKeyringInput);
- Java
-
次の Java の例では、RawPrivateKeyToStaticPublicKey
キー契約スキーマを使用して、送信者のプライベートキーと受信者のパブリックキーを静的に設定します。両方のキーペアがECC_NIST_P256
曲線上にあります。
private static void StaticRawKeyring() {
// Instantiate material providers
final MaterialProviders materialProviders =
MaterialProviders.builder()
.MaterialProvidersConfig(MaterialProvidersConfig.builder().build())
.build();
KeyPair senderKeys = GetRawEccKey();
KeyPair recipient = GetRawEccKey();
// Create the Raw ECDH static keyring
final CreateRawEcdhKeyringInput rawKeyringInput =
CreateRawEcdhKeyringInput.builder()
.curveSpec(ECDHCurveSpec.ECC_NIST_P256
)
.KeyAgreementScheme(
RawEcdhStaticConfigurations.builder()
.RawPrivateKeyToStaticPublicKey(
RawPrivateKeyToStaticPublicKeyInput.builder()
// Must be a PEM-encoded private key
.senderStaticPrivateKey(ByteBuffer.wrap(senderKeys.getPrivate().getEncoded()))
// Must be a DER-encoded X.509 public key
.recipientPublicKey(ByteBuffer.wrap(recipient.getPublic().getEncoded()))
.build()
)
.build()
).build();
final IKeyring staticKeyring = materialProviders.CreateRawEcdhKeyring(rawKeyringInput);
}
EphemeralPrivateKeyToStaticPublicKey
キーアグリーメントスキーマで設定されたEphemeralPrivateKeyToStaticPublicKey
キーリングは、ローカルで新しいキーペアを作成し、暗号化呼び出しごとに一意の共有ラッピングキーを取得します。
このキーアグリーメントスキーマはレコードのみを暗号化できます。EphemeralPrivateKeyToStaticPublicKey
キーアグリーメントスキーマで暗号化されたレコードを復号するには、同じ受信者のパブリックキーで設定された検出キーアグリーメントスキーマを使用する必要があります。復号するには、PublicKeyDiscoveryキーアグリーメントアルゴリズムで Raw ECDHキーリングを使用できます。受信者のパブリックキーが非対称キーアグリーメントKMSキーペアからのものである場合は、キーアグリーメントスキーマで KmsPublicKeyDiscovery キーリングを使用できます AWS KMS ECDH。
ECDH キーアグリーメントスキーマを使用して Raw EphemeralPrivateKeyToStaticPublicKey
キーリングを初期化するには、次の値を指定します。
-
受信者のパブリックキー
5280 で定義されているように、受信者の DERエンコードされた X.509 パブリックキー SubjectPublicKeyInfo
(SPKI) を指定する必要があります。 RFC
非対称キー契約KMSキーペアのパブリックキー、または の外部で生成されたキーペアのパブリックキーを指定できます AWS。
-
曲線仕様
指定されたパブリックキーの楕円曲線仕様を識別します。
暗号化時に、キーリングは指定された曲線に新しいキーペアを作成し、新しいプライベートキーと指定されたパブリックキーを使用して共有ラッピングキーを取得します。
有効な値: ECC_NIST_P256
、ECC_NIS_P384
、ECC_NIST_P512
- C# / .NET
-
次の例では、ECDHキーアグリーメントスキーマを使用して Raw EphemeralPrivateKeyToStaticPublicKey
キーリングを作成します。暗号化時に、キーリングは指定されたECC_NIST_P256
曲線にローカルで新しいキーペアを作成します。
// Instantiate material providers
var materialProviders = new MaterialProviders(new MaterialProvidersConfig());
var AlicePublicKey = new MemoryStream(new byte[] { });
// Create the Raw ECDH ephemeral keyring
var ephemeralConfiguration = new RawEcdhStaticConfigurations()
{
EphemeralPrivateKeyToStaticPublicKey = new EphemeralPrivateKeyToStaticPublicKeyInput
{
RecipientPublicKey = AlicePublicKey
}
};
var createKeyringInput = new CreateRawEcdhKeyringInput()
{
CurveSpec = ECDHCurveSpec.ECC_NIST_P256
,
KeyAgreementScheme = ephemeralConfiguration
};
var keyring = materialProviders.CreateRawEcdhKeyring(createKeyringInput);
- Java
-
次の例では、ECDHキーアグリーメントスキーマを使用して Raw EphemeralPrivateKeyToStaticPublicKey
キーリングを作成します。暗号化時に、キーリングは指定されたECC_NIST_P256
曲線にローカルで新しいキーペアを作成します。
private static void EphemeralRawEcdhKeyring() {
// Instantiate material providers
final MaterialProviders materialProviders =
MaterialProviders.builder()
.MaterialProvidersConfig(MaterialProvidersConfig.builder().build())
.build();
ByteBuffer recipientPublicKey = getPublicKeyBytes();
// Create the Raw ECDH ephemeral keyring
final CreateRawEcdhKeyringInput ephemeralInput =
CreateRawEcdhKeyringInput.builder()
.curveSpec(ECDHCurveSpec.ECC_NIST_P256
)
.KeyAgreementScheme(
RawEcdhStaticConfigurations.builder()
.EphemeralPrivateKeyToStaticPublicKey(
EphemeralPrivateKeyToStaticPublicKeyInput.builder()
.recipientPublicKey(recipientPublicKey)
.build()
)
.build()
).build();
final IKeyring ephemeralKeyring = materialProviders.CreateRawEcdhKeyring(ephemeralInput);
}
PublicKeyDiscovery
復号するときは、 AWS Database Encryption で使用できるラッピングキーを指定することがベストプラクティスSDKです。このベストプラクティスに従うには、送信者のプライベートECDHキーと受信者のパブリックキーの両方を指定する キーリングを使用します。ただし、Raw ECDH検出キーリング、つまり、指定されたECDHキーのパブリックキーが、暗号化されたレコードのマテリアルの説明フィールドに保存されている受信者のパブリックキーと一致するレコードを復号できる Raw キーリングを作成することもできます。このキーアグリーメントスキーマはレコードのみを復号できます。
PublicKeyDiscovery
キーアグリーメントスキーマを使用してレコードを復号するときは、所有者に関係なく、すべてのパブリックキーを受け入れます。
ECDH キーアグリーメントスキーマを使用して Raw PublicKeyDiscovery
キーリングを初期化するには、次の値を指定します。
-
受信者の静的プライベートキー
5958 で定義されているように、受信者の PEMエンコードされたプライベートキー (PKCS#8 PrivateKeyInfo structures) を指定する必要があります。 RFC
-
曲線仕様
指定されたプライベートキーの楕円曲線仕様を識別します。送信者と受信者の両方のキーペアは、同じ曲線仕様である必要があります。
有効な値: ECC_NIST_P256
、ECC_NIS_P384
、ECC_NIST_P512
- C# / .NET
-
次の例では、ECDHキーアグリーメントスキーマを使用して Raw PublicKeyDiscovery
キーリングを作成します。このキーリングは、指定されたプライベートキーのパブリックキーが、暗号化されたレコードのマテリアルの説明フィールドに保存されている受信者のパブリックキーと一致するレコードを復号できます。
// Instantiate material providers
var materialProviders = new MaterialProviders(new MaterialProvidersConfig());
var AlicePrivateKey = new MemoryStream(new byte[] { });
// Create the Raw ECDH discovery keyring
var discoveryConfiguration = new RawEcdhStaticConfigurations()
{
PublicKeyDiscovery = new PublicKeyDiscoveryInput
{
RecipientStaticPrivateKey = AlicePrivateKey
}
};
var createKeyringInput = new CreateRawEcdhKeyringInput()
{
CurveSpec = ECDHCurveSpec.ECC_NIST_P256,
KeyAgreementScheme = discoveryConfiguration
};
var keyring = materialProviders.CreateRawEcdhKeyring(createKeyringInput);
- Java
-
次の例では、ECDHキーアグリーメントスキーマを使用して Raw PublicKeyDiscovery
キーリングを作成します。このキーリングは、指定されたプライベートキーのパブリックキーが、暗号化されたレコードのマテリアルの説明フィールドに保存されている受信者のパブリックキーと一致するレコードを復号できます。
private static void RawEcdhDiscovery() {
// Instantiate material providers
final MaterialProviders materialProviders =
MaterialProviders.builder()
.MaterialProvidersConfig(MaterialProvidersConfig.builder().build())
.build();
KeyPair recipient = GetRawEccKey();
// Create the Raw ECDH discovery keyring
final CreateRawEcdhKeyringInput rawKeyringInput =
CreateRawEcdhKeyringInput.builder()
.curveSpec(ECDHCurveSpec.ECC_NIST_P256
)
.KeyAgreementScheme(
RawEcdhStaticConfigurations.builder()
.PublicKeyDiscovery(
PublicKeyDiscoveryInput.builder()
// Must be a PEM-encoded private key
.recipientStaticPrivateKey(ByteBuffer.wrap(sender.getPrivate().getEncoded()))
.build()
)
.build()
).build();
final IKeyring publicKeyDiscovery = materialProviders.CreateRawEcdhKeyring(rawKeyringInput);
}