커밋 정책 설정 - AWS Encryption SDK

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

커밋 정책 설정

키 커밋을 사용하면 암호화된 데이터가 항상 동일한 일반 텍스트로 복호화됩니다. 버전 1.7.x부터 이 보안 속성을 제공하기 위해 는 키 커밋이 있는 새 알고리즘 제품군을 AWS Encryption SDK 사용합니다. 데이터를 암호화하고 복호화할 때 키 커밋 사용 여부를 결정하려면 커밋 정책 구성 설정을 사용합니다. 키 커밋으로 데이터를 암호화하고 복호화하는 것이 AWS Encryption SDK 모범 사례입니다.

약정 정책 설정은 마이그레이션 프로세스의 두 번째 단계에서 중요한 부분으로, 의 최신 1.x 버전에서 버전 2.0.x 이상으로 마이그레이션 AWS Encryption SDK 합니다. 커밋 정책을 설정하고 변경한 후에는 애플리케이션을 프로덕션 환경에 배포하기 전에 철저하게 테스트해야 합니다. 마이그레이션 지침은 AWS Encryption SDK 마이그레이션 및 배포 방법 섹션을 참조하세요.

2.0.x 이상 버전에서 커밋 정책 설정에는 다음과 같은 세 가지 유효한 값이 있습니다. 최신 1.x 버전(1.7x 버전부터)에서는 ForbidEncryptAllowDecrypt만 유효합니다.

  • ForbidEncryptAllowDecrypt - 는 키 커밋으로 암호화할 AWS Encryption SDK 수 없습니다. 암호화된 사이퍼텍스트를 키 커밋 사용 여부와 관계없이 복호화할 수 있습니다.

    최신 1.x 버전에서 이는 유일하게 유효한 값입니다. 이를 통해 키 커밋으로 복호화할 준비가 완전히 완료되기 전까지는 키 커밋으로 암호화하지 않도록 합니다. 이 값을 명시적으로 설정하면 2.0.x 이상 버전으로 업그레이드할 때 커밋 정책이 자동으로 require-encrypt-require-decrypt로 변경되는 것을 방지할 수 있습니다. 대신, 단계적으로 커밋 정책을 마이그레이션할 수 있습니다.

  • RequireEncryptAllowDecrypt - 는 AWS Encryption SDK 항상 키 커밋으로 암호화합니다. 암호화된 사이퍼텍스트를 키 커밋 사용 여부와 관계없이 복호화할 수 있습니다. 이 값은 버전 2.0.x에 추가되었습니다.

  • RequireEncryptRequireDecrypt - 는 AWS Encryption SDK 항상 키 커밋으로 암호화 및 복호화합니다. 이 값은 버전 2.0.x에 추가되었습니다. 이는 버전 2.0.x 이상에서 기본값입니다.

최신 1.x 버전에서 유일하게 유효한 커밋 정책 값은 ForbidEncryptAllowDecrypt입니다. 2.0.x 이상 버전으로 마이그레이션한 후 준비가 되는 대로 커밋 정책을 단계적으로 변경할 수 있습니다. 키 커밋 없이 암호화된 메시지가 없는 것이 확인되기 전에는 커밋 정책을 RequireEncryptRequireDecrypt로 업데이트하지 마세요.

다음 예제는 최신 1.x 버전 및 2.0.x 이상 버전에서 커밋 정책을 설정하는 방법을 보여줍니다. 기술은 프로그래밍 언어에 따라 달라집니다.

마이그레이션에 대해 자세히 알아보기

AWS Encryption SDK for Java AWS Encryption SDK for Python, 및 AWS 암호화 의 경우 CLI에서 마스터 키 공급자에 필요한 변경 사항에 대해 알아봅니다AWS KMS 마스터 키 공급자 업데이트.

AWS Encryption SDK for C 및 의 경우 의 키링에 대한 선택적 업데이트에 대해 AWS Encryption SDK for JavaScript알아봅니다AWS KMS 키링 업데이트.

커밋 정책 설정 방법

커밋 정책을 설정하는 데 사용하는 방법은 각 언어 구현마다 조금씩 다릅니다. 이 예제에서는 해당 작업 방법을 보여줍니다. 커밋 정책을 변경하기 전에 마이그레이션 및 배포 방법에서 다단계 접근 방식을 검토하세요.

C

의 버전 1.7.x부터는 aws_cryptosdk_session_set_commitment_policy 함수를 AWS Encryption SDK for C사용하여 암호화 및 복호화 세션에서 약정 정책을 설정합니다. 설정한 커밋 정책은 해당 세션에서 호출된 모든 암호화 및 복호화 작업에 적용됩니다.

aws_cryptosdk_session_new_from_keyringaws_cryptosdk_session_new_from_cmm 함수는 버전 1.7.x에서 더 이상 사용되지 않으며 버전 2.0.x에서 제거되었습니다. 이러한 함수는 세션을 반환하는 aws_cryptosdk_session_new_from_keyring_2aws_cryptosdk_session_new_from_cmm_2 함수로 대체됩니다.

최신 1.x 버전에서 aws_cryptosdk_session_new_from_keyring_2aws_cryptosdk_session_new_from_cmm_2를 사용한 경우 COMMITMENT_POLICY_FORBID_ENCRYPT_ALLOW_DECRYPT 커밋 정책 값을 사용하여 aws_cryptosdk_session_set_commitment_policy 함수를 호출해야 합니다. 2.0.x 이상 버전의 경우 이 함수를 호출하는 것은 선택 사항이며 유효한 값을 모두 사용합니다. 2.0.x 이상 버전의 기본 커밋 정책은 COMMITMENT_POLICY_REQUIRE_ENCRYPT_REQUIRE_DECRYPT입니다.

전체 예를 보려면 string.cpp를 참조하세요.

/* Load error strings for debugging */ aws_cryptosdk_load_error_strings(); /* Create an AWS KMS keyring */ const char * key_arn = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"; struct aws_cryptosdk_keyring *kms_keyring = Aws::Cryptosdk::KmsKeyring::Builder().Build(key_arn); /* Create an encrypt session with a CommitmentPolicy setting */ struct aws_cryptosdk_session *encrypt_session = aws_cryptosdk_session_new_from_keyring_2( alloc, AWS_CRYPTOSDK_ENCRYPT, kms_keyring); aws_cryptosdk_keyring_release(kms_keyring); aws_cryptosdk_session_set_commitment_policy(encrypt_session, COMMITMENT_POLICY_FORBID_ENCRYPT_ALLOW_DECRYPT); ... /* Encrypt your data */ size_t plaintext_consumed_output; aws_cryptosdk_session_process(encrypt_session, ciphertext_output, ciphertext_buf_sz_output, ciphertext_len_output, plaintext_input, plaintext_len_input, &plaintext_consumed_output) ... /* Create a decrypt session with a CommitmentPolicy setting */ struct aws_cryptosdk_keyring *kms_keyring = Aws::Cryptosdk::KmsKeyring::Builder().Build(key_arn); struct aws_cryptosdk_session *decrypt_session = *aws_cryptosdk_session_new_from_keyring_2( alloc, AWS_CRYPTOSDK_DECRYPT, kms_keyring); aws_cryptosdk_keyring_release(kms_keyring); aws_cryptosdk_session_set_commitment_policy(decrypt_session, COMMITMENT_POLICY_FORBID_ENCRYPT_ALLOW_DECRYPT); /* Decrypt your ciphertext */ size_t ciphertext_consumed_output; aws_cryptosdk_session_process(decrypt_session, plaintext_output, plaintext_buf_sz_output, plaintext_len_output, ciphertext_input, ciphertext_len_input, &ciphertext_consumed_output)
C# / .NET

require-encrypt-require-decrypt 값은 용 AWS Encryption SDK 의 모든 버전에서 기본 약정 정책입니다NET. 모범 사례로 명시적으로 설정할 수 있지만 필수 사항은 아닙니다. 그러나 AWS Encryption SDK for NET를 사용하는 경우 키 커밋 AWS Encryption SDK 없이 의 다른 언어 구현으로 암호화된 암호 텍스트를 해독하려면 커밋 정책 값을 REQUIRE_ENCRYPT_ALLOW_DECRYPT 또는 로 변경해야 합니다FORBID_ENCRYPT_ALLOW_DECRYPT. 그러지 않으면 사이퍼텍스트 복호화 시도가 실패합니다.

AWS Encryption SDK 의 에서 의 인스턴스에 대한 약정 정책을 NET설정합니다 AWS Encryption SDK. CommitmentPolicy 파라미터를 사용하여 AwsEncryptionSdkConfig 객체를 인스턴스화하고 구성 객체를 사용하여 AWS Encryption SDK 인스턴스를 생성합니다. 그런 다음 구성된 AWS Encryption SDK 인스턴스의 Encrypt()Decrypt() 메서드를 호출합니다.

이 예에서는 커밋 정책을 require-encrypt-allow-decrypt로 설정합니다.

// Instantiate the material providers var materialProviders = AwsCryptographicMaterialProvidersFactory.CreateDefaultAwsCryptographicMaterialProviders(); // Configure the commitment policy on the AWS Encryption SDK instance var config = new AwsEncryptionSdkConfig { CommitmentPolicy = CommitmentPolicy.REQUIRE_ENCRYPT_ALLOW_DECRYPT }; var encryptionSdk = AwsEncryptionSdkFactory.CreateAwsEncryptionSdk(config); string keyArn = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"; var encryptionContext = new Dictionary<string, string>() { {"purpose", "test"}encryptionSdk }; var createKeyringInput = new CreateAwsKmsKeyringInput { KmsClient = new AmazonKeyManagementServiceClient(), KmsKeyId = keyArn }; var keyring = materialProviders.CreateAwsKmsKeyring(createKeyringInput); // Encrypt your plaintext data var encryptInput = new EncryptInput { Plaintext = plaintext, Keyring = keyring, EncryptionContext = encryptionContext }; var encryptOutput = encryptionSdk.Encrypt(encryptInput); // Decrypt your ciphertext var decryptInput = new DecryptInput { Ciphertext = ciphertext, Keyring = keyring }; var decryptOutput = encryptionSdk.Decrypt(decryptInput);
AWS Encryption CLI

AWS 암호화 에서 약정 정책을 설정하려면 --commitment-policy 파라미터를 CLI사용합니다. 이 파라미터는 버전 1.8.x에 도입되었습니다.

최신 1.x 버전의 경우 --encrypt 또는 --decrypt 명령에서 --wrapping-keys 파라미터를 사용할 때는 forbid-encrypt-allow-decrypt 값이 있는 --commitment-policy 파라미터가 필요합니다. 그러지 않으면 --commitment-policy 파라미터가 유효하지 않게 됩니다.

2.1.x 및 이상 버전에서는 --commitment-policy 파라미터가 선택 사항이며 키 커밋 없이 암호화된 사이퍼텍스트를 암호화하거나 복호화하지 않는 require-encrypt-require-decrypt 값이 기본값입니다. 하지만 유지 관리 및 문제 해결에 도움이 되도록 모든 암호화 및 복호화 호출에서 커밋 정책을 명시적으로 설정하는 것이 좋습니다.

이 예에서는 커밋 정책을 설정합니다. 또한 1.8.x 버전부터 --master-keys 파라미터를 대체하는 --wrapping-keys 파라미터를 사용합니다. 세부 정보는 AWS KMS 마스터 키 공급자 업데이트을 참조하세요. 전체 예제는 AWS Encryption CLI의 예제 섹션을 참조하세요.

\\ To run this example, replace the fictitious key ARN with a valid value. $ keyArn=arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab \\ Encrypt your plaintext data - no change to algorithm suite used $ aws-encryption-cli --encrypt \ --input hello.txt \ --wrapping-keys key=$keyArn \ --commitment-policy forbid-encrypt-allow-decrypt \ --metadata-output ~/metadata \ --encryption-context purpose=test \ --output . \\ Decrypt your ciphertext - supports key commitment on 1.7 and later $ aws-encryption-cli --decrypt \ --input hello.txt.encrypted \ --wrapping-keys key=$keyArn \ --commitment-policy forbid-encrypt-allow-decrypt \ --encryption-context purpose=test \ --metadata-output ~/metadata \ --output .
Java

의 버전 1.7.x부터 AWS Encryption SDK 클라이언트를 나타내는 객체AwsCrypto인 인스턴스에 약정 정책을 AWS Encryption SDK for Java설정합니다. 이 커밋 정책 설정은 해당 클라이언트에서 호출된 모든 암호화 및 복호화 작업에 적용됩니다.

AwsCrypto() 생성기는 최신 1.x 버전의 에서 더 이상 사용되지 AWS Encryption SDK for Java 않으며 버전 2.0.x 에서 제거됩니다. 새 Builder 클래스, Builder.withCommitmentPolicy() 메서드, CommitmentPolicy 열거 유형으로 대체됩니다.

최신 1.x 버전의 Builder 클래스에는 Builder.withCommitmentPolicy() 메서드와 CommitmentPolicy.ForbidEncryptAllowDecrypt 인수가 필요합니다. 2.0.x 버전부터 Builder.withCommitmentPolicy() 메서드는 선택 사항이고 기본값은 CommitmentPolicy.RequireEncryptRequireDecrypt입니다.

전체 예제는 SetCommitmentPolicyExample.java 를 참조하세요.

// Instantiate the client final AwsCrypto crypto = AwsCrypto.builder() .withCommitmentPolicy(CommitmentPolicy.ForbidEncryptAllowDecrypt) .build(); // Create a master key provider in strict mode String awsKmsKey = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"; KmsMasterKeyProvider masterKeyProvider = KmsMasterKeyProvider.builder() .buildStrict(awsKmsKey); // Encrypt your plaintext data CryptoResult<byte[], KmsMasterKey> encryptResult = crypto.encryptData( masterKeyProvider, sourcePlaintext, encryptionContext); byte[] ciphertext = encryptResult.getResult(); // Decrypt your ciphertext CryptoResult<byte[], KmsMasterKey> decryptResult = crypto.decryptData( masterKeyProvider, ciphertext); byte[] decrypted = decryptResult.getResult();
JavaScript

의 버전 1.7.x부터 AWS Encryption SDK 클라이언트를 인스턴스화하는 새 buildClient 함수를 호출할 때 약정 정책을 설정할 AWS Encryption SDK for JavaScript수 있습니다. buildClient 함수는 커밋 정책을 나타내는 열거형 값을 사용합니다. 암호화 및 복호화 시 커밋 정책을 적용하는 업데이트된 encryptdecrypt 함수를 반환합니다.

최신 1.x 버전에서는 buildClient 함수에 CommitmentPolicy.FORBID_ENCRYPT_ALLOW_DECRYPT 인수가 필요합니다. 2.0.x 버전부터 커밋 정책 인수는 선택 사항이고 기본값은 CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT입니다.

브라우저에 자격 증명을 설정하려면 명령문이 필요하다는 점을 제외하면 Node.js 코드와 브라우저의 코드는 동일합니다.

다음 예제에서는 AWS KMS 키링을 사용하여 데이터를 암호화합니다. 새 buildClient 함수는 커밋 정책을 FORBID_ENCRYPT_ALLOW_DECRYPT로 설정하며 이는 최신 1.x 버전의 기본값입니다. buildClient에서 반환되는 업그레이드된 encryptdecrypt 함수는 사용자가 설정한 커밋 정책을 적용합니다.

import { buildClient } from '@aws-crypto/client-node' const { encrypt, decrypt } = buildClient(CommitmentPolicy.FORBID_ENCRYPT_ALLOW_DECRYPT) // Create an AWS KMS keyring const generatorKeyId = 'arn:aws:kms:us-west-2:111122223333:alias/ExampleAlias' const keyIds = ['arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab'] const keyring = new KmsKeyringNode({ generatorKeyId, keyIds }) // Encrypt your plaintext data const { ciphertext } = await encrypt(keyring, plaintext, { encryptionContext: context }) // Decrypt your ciphertext const { decrypted, messageHeader } = await decrypt(keyring, ciphertext)
Python

의 버전 1.7.x부터 AWS Encryption SDK 클라이언트를 나타내는 새 객체EncryptionSDKClient인 의 인스턴스에 약정 정책을 AWS Encryption SDK for Python설정합니다. 설정한 커밋 정책은 해당 클라이언트 인스턴스를 사용하는 모든 encryptdecrypt 호출에 적용됩니다.

최신 1.x 버전의 EncryptionSDKClient 생성자에는 CommitmentPolicy.FORBID_ENCRYPT_ALLOW_DECRYPT 열거형 값이 필요합니다. 2.0.x 버전부터 커밋 정책 인수는 선택 사항이고 기본값은 CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT입니다.

이 예제에서는 새 EncryptionSDKClient 생성자를 사용하고 커밋 정책을 1.7.x 기본값으로 설정합니다. 생성자는 AWS Encryption SDK를 나타내는 클라이언트를 인스턴스화합니다. 이 클라이언트에서 encrypt, decrypt 또는 stream 메서드를 호출하면 설정한 커밋 정책이 적용됩니다. 이 예제에서는 암호화 및 복호화 AWS KMS keys 시기를 지정하는 StrictAwsKmsMasterKeyProvider 클래스의 새 생성기도 사용합니다.

전체 예제는 set_commitment.py를 참조하세요.

# Instantiate the client client = aws_encryption_sdk.EncryptionSDKClient(commitment_policy=CommitmentPolicy.FORBID_ENCRYPT_ALLOW_DECRYPT) // Create a master key provider in strict mode aws_kms_key = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" aws_kms_strict_master_key_provider = StrictAwsKmsMasterKeyProvider( key_ids=[aws_kms_key] ) # Encrypt your plaintext data ciphertext, encrypt_header = client.encrypt( source=source_plaintext, encryption_context=encryption_context, master_key_provider=aws_kms_strict_master_key_provider ) # Decrypt your ciphertext decrypted, decrypt_header = client.decrypt( source=ciphertext, master_key_provider=aws_kms_strict_master_key_provider )