약정 정책 설정하기 - AWS Encryption SDK

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

약정 정책 설정하기

주요 약정은 암호화된 데이터가 항상 동일한 일반 텍스트로 복호화되도록 보장합니다. 버전 1.7부터 이 보안 속성을 제공합니다. x, 는 키 커밋과 함께 새로운 알고리즘 제품군을AWS Encryption SDK 사용합니다. 키 약정을 통해 데이터가 암호화되고 해독되는지 확인하려면 약정 정책 구성 설정을 사용하십시오. 키 약정을 통한 데이터 암호화 및 암호 해독이 AWS Encryption SDK모범 사례입니다.

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

버전 2.0에서는 약정 정책 설정에 세 가지 유효한 값이 있습니다. x 이상 최근 1. x 버전 (을 버전 1.7부터 업데이트 x) 만ForbidEncryptAllowDecrypt 유효합니다.

  • ForbidEncryptAllowDecrypt— 키 약정으로 암호화할AWS Encryption SDK 수 없습니다. 키 커밋 유무에 관계없이 암호화된 암호문을 해독할 수 있습니다.

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

  • 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 JavaAWS Encryption SDK for Python, 및AWS Encryption CLI의 경우 마스터 키 제공자를 위한 필수 변경 사항에 대해 알아보십시오AWS KMS마스터 키 제공자 업데이트.

AWS Encryption SDK for C및AWS Encryption SDK for JavaScript 의 키링에 대한 선택적 업데이트에 대해 알아보십시오업데이트 중AWS KMS열쇠 고리.

약정 정책 설정 방법

약정 정책을 설정하는 데 사용하는 기술은 각 언어 구현에 따라 약간씩 다릅니다. 다음 예에서는 그 방법을 보여줍니다. 약정 정책을 변경하기 전에 에서 다단계 접근 방식을마이그레이션 및 배포 방법 검토하십시오.

C

을 버전 1.7부터 업데이트 x 중AWS Encryption SDK for C,aws_cryptosdk_session_set_commitment_policy 함수를 사용하여 암호화 및 암호 해독 세션에 대한 약정 정책을 설정합니다. 설정한 약정 정책은 해당 세션에서 호출되는 모든 암호화 및 암호 해독 작업에 적용됩니다.

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 함수로 대체됩니다.

최신aws_cryptosdk_session_new_from_cmm_2 버전에서aws_cryptosdk_session_new_from_keyring_2 및 를 사용하는 경우 1. x 버전에서는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 for .NET에 있는 기본 약정 정책입니다. 이를 모범 사례입니다. 하지만 필수 사례입니다. 하지만AWS Encryption SDK for .NET을 사용하여 다른 언어 구현으로 암호화된 암호문을 키 커밋AWS Encryption SDK 없이 해독하는 경우에는 커밋 정책 값을REQUIRE_ENCRYPT_ALLOW_DECRYPT 또는 로 변경해야FORBID_ENCRYPT_ALLOW_DECRYPT 합니다. 그렇지 않으면 암호문을 해독하려는 시도가 실패합니다.

AWS Encryption SDKfor .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암호화 CLI에서 약정 정책을 설정하려면--commitment-policy 파라미터를 사용하십시오. 이 매개 변수는 을 버전 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부터 시작하는--master-keys 매개 변수를 대체하는 매개 변수를 사용합니다.--wrapping-keys x. 세부 정보는 AWS KMS마스터 키 제공자 업데이트을 참조하세요. 전체 예제는 을 참조하십시오다음 예시AWS암호화 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 for JavaAWS Encryption SDK 클라이언트를 나타내는 객체인 의AwsCrypto 인스턴스에 커밋 정책을 설정합니다. 이 약정 정책 설정은 해당 클라이언트에서 호출되는 모든 암호화 및 암호 해독 작업에 적용됩니다.

AwsCrypto()생성자는 최신 1에서 더 이상 사용되지 않습니다. AWS Encryption SDK for Java및 의 x 버전은 버전 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 for JavaScriptAWS Encryption SDK 클라이언트를 인스턴스화하는 새buildClient 함수를 호출할 때 커밋 정책을 설정할 수 있습니다. 이buildClient 함수는 약정 정책을 나타내는 열거된 값을 사용합니다. 암호화encrypt 및 암호 해독 시 약정 정책을 적용하는 업데이트된 함수와decrypt 함수를 반환합니다.

최근 1. x 버전에서는buildClient 함수에CommitmentPolicy.FORBID_ENCRYPT_ALLOW_DECRYPT 인수가 필요합니다. 을 버전 2.0부터 업데이트 x, 약정 정책 인수는 선택 사항이며 기본값은 입니다CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT.

브라우저가 자격 증명을 설정하기 위한 명령문을 필요로 한다는 점을 제외하면 Node.js 및 브라우저의 코드는 이 목적상 동일합니다.

다음 예제는AWS KMS 키링을 사용하여 데이터를 암호화합니다. 새buildClient 함수는 약정 정책을 최신 1의 기본값인 로 설정합니다.FORBID_ENCRYPT_ALLOW_DECRYPT 엑스 버전. 업그레이드된encryptdecrypt 함수와buildClient 반환되는 함수는 설정한 약정 정책을 적용합니다.

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 for PythonAWS Encryption SDK 클라이언트를 나타내는 새 객체의 인스턴스에 커밋 정책을 설정합니다.EncryptionSDKClient 설정한 약정 정책은 해당 클라이언트 인스턴스를 사용하는 모든decrypt 통화encrypt 및 통화에 적용됩니다.

최근 1. x 버전의 경우EncryptionSDKClient 생성자에는CommitmentPolicy.FORBID_ENCRYPT_ALLOW_DECRYPT 열거된 값이 필요합니다. 을 버전 2.0부터 업데이트 x, 약정 정책 인수는 선택 사항이며 기본값은 입니다CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT.

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

전체 예제는 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 )