翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
AWS KMS ECDH キーリング
AWS KMS ECDH キーリングは、非対称キーアグリーメントAWS KMS keysを使用して、2 つの当事者間で共有対称ラッピングキーを取得します。まず、キーリングは Elliptic Curve Diffie-Hellman (ECDH) キー契約アルゴリズムを使用して、送信者のキーKMSペアのプライベートキーと受信者のパブリックキーから共有シークレットを取得します。次に、キーリングは共有シークレットを使用して、データ暗号化キーを保護する共有ラッピングキーを取得します。が (KDF_CTR_HMAC_SHA384
) AWS Encryption SDK を使用して共有ラッピングキーを導出するキー導出関数は、NISTキー導出の推奨事項 に準拠しています。
キー派生関数は、64 バイトのキーマテリアルを返します。両当事者が正しいキーイングマテリアルを使用するようにするために、 AWS Encryption SDK は最初の 32 バイトをコミットメントキーとして使用し、最後の 32 バイトを共有ラッピングキーとして使用します。復号時に、キーリングがメッセージヘッダー暗号文に保存されているのと同じコミットメントキーと共有ラッピングキーを再現できない場合、オペレーションは失敗します。例えば、Alice のプライベートキーと Bob のパブリックキーで設定されたキーリングでデータを暗号化した場合、Bob のプライベートキーと Alice のパブリックキーで設定されたキーリングは、同じコミットメントキーと共有ラッピングキーを再現し、データを復号化できます。Bob のパブリックキーがKMSキーペアからでない場合、Bob は Raw ECDHキーリングを作成してデータを復号できます。
AWS KMS ECDH キーリングは、AES- を使用して対称キーでデータを暗号化しますGCM。次に、データキーはAES、- を使用して派生した共有ラッピングキーでエンベロープ暗号化されますGCM。各 AWS KMS ECDHキーリングには共有ラッピングキーを 1 つだけ持つことができますが、複数の AWS KMS ECDHキーリングを単独で、または他のキーリングと共にマルチキーリング に含めることができます。
プログラミング言語の互換性
キーリングは Cryptographic Material Providers Library (MPL) のバージョン AWS KMS ECDH1.5.0 で導入され、以下のプログラミング言語とバージョンでサポートされています。
-
のバージョン 3.x AWS Encryption SDK for Java
-
AWS Encryption SDK 用 のバージョン 4.x。NET
-
バージョン 4.x AWS Encryption SDK for Python、オプションのMPL依存関係で使用する場合。
AWS KMS ECDH キーリングに必要なアクセス許可
AWS Encryption SDK には AWS アカウントは不要で、どの AWS サービスにも依存しません。ただし、キーリングを使用するには AWS KMS ECDH、 AWS アカウントと、キーリング AWS KMS keys の に対する以下の最小アクセス許可が必要です。アクセス許可は、使用するキーアグリーメントスキーマによって異なります。
AWS KMS ECDH キーリングの作成
データを暗号化および復号化するキーリングを作成するには AWS KMS ECDH、KmsPrivateKeyToStaticPublicKey
キーアグリーメントスキーマを使用する必要があります。キーアグリーメントスキーマを使用してKmsPrivateKeyToStaticPublicKey
キーリングを初期化 AWS KMS ECDHするには、次の値を指定します。
-
送信者 AWS KMS key ID
KeyUsage
値が の非対称 NIST- 推奨楕円曲線 (ECC) KMSキーペアを識別する必要がありますKEY_AGREEMENT
。送信者のプライベートキーは、共有シークレットを導き出すために使用されます。
-
(オプション) 送信者のパブリックキー
RFC 5280 で定義されているように、DERエンコードされた X.509 パブリックキー、または SubjectPublicKeyInfo
(SPKI) である必要があります。
オペレーションは AWS KMS GetPublicKey、非対称キーペアのパブリックKMSキーを必要なDERエンコード形式で返します。
キーリングが行う AWS KMS 呼び出しの数を減らすには、送信者のパブリックキーを直接指定できます。送信者のパブリックキーに値が指定されていない場合、キーリングは呼び出し AWS KMS て送信者のパブリックキーを取得します。
-
受信者のパブリックキー
RFC 5280 で定義されているように、受信者のDERエンコードされた X.509 パブリックキー、または SubjectPublicKeyInfo
(SPKI) を指定する必要があります。
オペレーションは AWS KMS GetPublicKey、非対称キーペアのパブリックKMSキーを必要なDERエンコード形式で返します。
-
曲線仕様
指定されたキーペアの楕円曲線仕様を識別します。送信者と受信者の両方のキーペアは、同じ曲線仕様である必要があります。
有効な値: ECC_NIST_P256
、ECC_NIS_P384
、ECC_NIST_P512
-
(オプション) 許可トークンのリスト
許可 を使用してキーリング内のKMS AWS KMS ECDHキーへのアクセスを制御する場合は、キーリングを初期化するときに必要なすべての許可トークンを指定する必要があります。
- C# / .NET
-
次の例では、 AWS KMS ECDH送信者のキー、送信者のパブリックKMSキー、受信者のパブリックキーを使用して を使用してキーリングを作成します。この例では、オプションの SenderPublicKey
パラメータを使用して、送信者のパブリックキーを指定します。送信者のパブリックキーを指定しない場合、キーリングは呼び出し AWS KMS て送信者のパブリックキーを取得します。送信者と受信者の両方のキーペアがECC_NIST_P256
曲線上にあります。
// Instantiate material providers
var materialProviders = new MaterialProviders(new MaterialProvidersConfig());
// Must be DER-encoded X.509 public keys
var BobPublicKey = new MemoryStream(new byte[] { });
var AlicePublicKey = new MemoryStream(new byte[] { });
// Create the AWS KMS ECDH static keyring
var staticConfiguration = new KmsEcdhStaticConfigurations
{
KmsPrivateKeyToStaticPublicKey = new KmsPrivateKeyToStaticPublicKeyInput
{
SenderKmsIdentifier = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab
",
SenderPublicKey = BobPublicKey,
RecipientPublicKey = AlicePublicKey
}
};
var createKeyringInput = new CreateAwsKmsEcdhKeyringInput
{
CurveSpec = ECDHCurveSpec.ECC_NIST_P256
,
KmsClient = new AmazonKeyManagementServiceClient(),
KeyAgreementScheme = staticConfiguration
};
var keyring = materialProviders.CreateAwsKmsEcdhKeyring(createKeyringInput);
- Java
-
次の例では、 AWS KMS ECDH送信者のキー、送信者のパブリックKMSキー、受信者のパブリックキーを使用して を使用してキーリングを作成します。この例では、オプションの senderPublicKey
パラメータを使用して、送信者のパブリックキーを指定します。送信者のパブリックキーを指定しない場合、キーリングは呼び出し AWS KMS て送信者のパブリックキーを取得します。送信者と受信者の両方のキーペアがECC_NIST_P256
曲線上にあります。
// Retrieve public keys
// Must be DER-encoded X.509 public keys
ByteBuffer BobPublicKey = getPublicKeyBytes("arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab
");
ByteBuffer AlicePublicKey = getPublicKeyBytes("arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321
");
// Create the AWS KMS ECDH static keyring
final CreateAwsKmsEcdhKeyringInput senderKeyringInput =
CreateAwsKmsEcdhKeyringInput.builder()
.kmsClient(KmsClient.create())
.curveSpec(ECDHCurveSpec.ECC_NIST_P256
)
.KeyAgreementScheme(
KmsEcdhStaticConfigurations.builder()
.KmsPrivateKeyToStaticPublicKey(
KmsPrivateKeyToStaticPublicKeyInput.builder()
.senderKmsIdentifier("arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab
")
.senderPublicKey(BobPublicKey)
.recipientPublicKey(AlicePublicKey)
.build()).build()).build();
- Python
-
次の例では、 AWS KMS ECDH送信者のキー、送信者のパブリックKMSキー、受信者のパブリックキーを使用して キーリングを作成します。この例では、オプションの senderPublicKey
パラメータを使用して、送信者のパブリックキーを指定します。送信者のパブリックキーを指定しない場合、キーリングは呼び出し AWS KMS て送信者のパブリックキーを取得します。送信者と受信者の両方のキーペアがECC_NIST_P256
曲線上にあります。
import boto3
from aws_cryptographic_materialproviders.mpl.models import (
CreateAwsKmsEcdhKeyringInput,
KmsEcdhStaticConfigurationsKmsPrivateKeyToStaticPublicKey,
KmsPrivateKeyToStaticPublicKeyInput,
)
from aws_cryptography_primitives.smithygenerated.aws_cryptography_primitives.models import ECDHCurveSpec
# Instantiate the material providers library
mat_prov: AwsCryptographicMaterialProviders = AwsCryptographicMaterialProviders(
config=MaterialProvidersConfig()
)
# Retrieve public keys
# Must be DER-encoded X.509 public keys
bob_public_key = get_public_key_bytes("arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab
")
alice_public_key = get_public_key_bytes("arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321
")
# Create the AWS KMS ECDH static keyring
sender_keyring_input = CreateAwsKmsEcdhKeyringInput(
kms_client = boto3.client('kms', region_name="us-west-2"),
curve_spec = ECDHCurveSpec.ECC_NIST_P256
,
key_agreement_scheme = KmsEcdhStaticConfigurationsKmsPrivateKeyToStaticPublicKey(
KmsPrivateKeyToStaticPublicKeyInput(
sender_kms_identifier = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab
",
sender_public_key = bob_public_key,
recipient_public_key = alice_public_key,
)
)
)
keyring = mat_prov.create_aws_kms_ecdh_keyring(sender_keyring_input)
検出キーリングの作成 AWS KMS ECDH
復号する場合、 AWS Encryption SDK で使用できるキーを指定するのがベストプラクティスです。このベストプラクティスに従うには、キーアグリーメントスキーマでKmsPrivateKeyToStaticPublicKey
キーリングを使用します AWS KMS ECDH。ただし、検出キーリング、 AWS KMS ECDHつまり、 AWS KMS ECDH指定されたキーペアのパブリックキーがメッセージ暗号文に保存されている受信者のパブリックキーと一致するメッセージを復号できるKMSキーリングを作成することもできます。
KmsPublicKeyDiscovery
キーアグリーメントスキーマを使用してメッセージを復号する場合、誰が所有しているかに関係なく、すべてのパブリックキーを受け入れます。
キーアグリーメントスキーマを使用してKmsPublicKeyDiscovery
キーリングを初期化 AWS KMS ECDHするには、次の値を指定します。
-
受信者の AWS KMS key ID
KeyUsage
値が の非対称のNIST推奨楕円曲線 (ECC) KMSキーペアを識別する必要がありますKEY_AGREEMENT
。
-
曲線仕様
受信者のKMSキーペアの楕円曲線仕様を識別します。
有効な値: ECC_NIST_P256
、ECC_NIS_P384
、ECC_NIST_P512
-
(オプション) 許可トークンのリスト
許可 を使用してキーリング内のKMS AWS KMS ECDHキーへのアクセスを制御する場合は、キーリングを初期化するときに必要なすべての許可トークンを提供する必要があります。
- C# / .NET
-
次の例では、 AWS KMS ECDHECC_NIST_P256
曲線にキーペアを持つ検出KMSキーリングを作成します。指定されたKMSキーペアには kms:GetPublicKey および kms:DeriveSharedSecret アクセス許可が必要です。このキーリングは、指定されたキーKMSペアのパブリックキーが、メッセージ暗号文に保存されている受信者のパブリックキーと一致するメッセージを復号できます。
// Instantiate material providers
var materialProviders = new MaterialProviders(new MaterialProvidersConfig());
// Create the AWS KMS ECDH discovery keyring
var discoveryConfiguration = new KmsEcdhStaticConfigurations
{
KmsPublicKeyDiscovery = new KmsPublicKeyDiscoveryInput
{
RecipientKmsIdentifier = "arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321
"
}
};
var createKeyringInput = new CreateAwsKmsEcdhKeyringInput
{
CurveSpec = ECDHCurveSpec.ECC_NIST_P256
,
KmsClient = new AmazonKeyManagementServiceClient(),
KeyAgreementScheme = discoveryConfiguration
};
var keyring = materialProviders.CreateAwsKmsEcdhKeyring(createKeyringInput);
- Java
-
次の例では、 AWS KMS ECDHECC_NIST_P256
曲線にキーペアを持つ検出KMSキーリングを作成します。指定されたKMSキーペアには kms:GetPublicKey および kms:DeriveSharedSecret アクセス許可が必要です。このキーリングは、指定されたキーKMSペアのパブリックキーが、メッセージ暗号文に保存されている受信者のパブリックキーと一致するメッセージを復号できます。
// Create the AWS KMS ECDH discovery keyring
final CreateAwsKmsEcdhKeyringInput recipientKeyringInput =
CreateAwsKmsEcdhKeyringInput.builder()
.kmsClient(KmsClient.create())
.curveSpec(ECDHCurveSpec.ECC_NIST_P256
)
.KeyAgreementScheme(
KmsEcdhStaticConfigurations.builder()
.KmsPublicKeyDiscovery(
KmsPublicKeyDiscoveryInput.builder()
.recipientKmsIdentifier("arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321
").build()
).build())
.build();
- Python
-
次の例では、 AWS KMS ECDHECC_NIST_P256
曲線にキーペアを持つ検出KMSキーリングを作成します。指定されたKMSキーペアには kms:GetPublicKey および kms:DeriveSharedSecret アクセス許可が必要です。このキーリングは、指定されたキーKMSペアのパブリックキーが、メッセージ暗号文に保存されている受信者のパブリックキーと一致するメッセージを復号できます。
import boto3
from aws_cryptographic_materialproviders.mpl.models import (
CreateAwsKmsEcdhKeyringInput,
KmsEcdhStaticConfigurationsKmsPublicKeyDiscovery,
KmsPublicKeyDiscoveryInput,
)
from aws_cryptography_primitives.smithygenerated.aws_cryptography_primitives.models import ECDHCurveSpec
# Instantiate the material providers library
mat_prov: AwsCryptographicMaterialProviders = AwsCryptographicMaterialProviders(
config=MaterialProvidersConfig()
)
# Create the AWS KMS ECDH discovery keyring
create_keyring_input = CreateAwsKmsEcdhKeyringInput(
kms_client = boto3.client('kms', region_name="us-west-2"),
curve_spec = ECDHCurveSpec.ECC_NIST_P256
,
key_agreement_scheme = KmsEcdhStaticConfigurationsKmsPublicKeyDiscovery(
KmsPublicKeyDiscoveryInput(
recipient_kms_identifier = "arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321
",
)
)
)
keyring = mat_prov.create_aws_kms_ecdh_keyring(create_keyring_input)