

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

# 란 무엇입니까 AWS Encryption SDK?
<a name="introduction"></a>

는 모든 사용자가 업계 표준 및 모범 사례를 사용하여 데이터를 쉽게 암호화하고 해독할 수 있도록 설계된 클라이언트 측 암호화 라이브러리 AWS Encryption SDK 입니다. 그럼으로써 데이터의 암호화 및 복호화 방법보다 애플리케이션의 핵심 기능에 집중할 수 있습니다. AWS Encryption SDK 는 Apache 2.0 라이선스에 따라 무료로 제공됩니다.

는 다음과 같은 질문에 AWS Encryption SDK 답합니다.
+ 어떤 암호화 알고리즘을 사용해야 하나요?
+ 이 알고리즘을 어떻게, 어떤 모드에서 사용해야 하나요?
+ 암호화 키는 어떻게 생성하나요?
+ 암호화 키를 보호하려면 어떻게 해야 하며 어디에 저장해야 하나요?
+ 암호화된 데이터를 이동 가능하게 만들려면 어떻게 해야 하나요?
+ 의도한 수신자가 내 암호화된 데이터를 읽을 수 있도록 하려면 어떻게 해야 하나요?
+ 기록된 시점과 읽은 시점 사이에 내 암호화된 데이터가 수정되지 않도록 하려면 어떻게 해야 하나요?
+ 에서 AWS KMS 반환하는 데이터 키를 사용하려면 어떻게 해야 합니까?

를 사용하여 데이터를 보호하는 데 사용할 래핑 [키를 결정하는 마스터 키 공급자](concepts.md#master-key-provider) 또는 키[링](concepts.md#keyring)을 AWS Encryption SDK정의합니다. 그런 다음에서 제공하는 간단한 방법을 사용하여 데이터를 암호화하고 해독합니다 AWS Encryption SDK. 는 나머지를 AWS Encryption SDK 수행합니다.

이 없으면 애플리케이션의 핵심 기능보다 암호화 솔루션을 구축하는 데 더 많은 노력을 AWS Encryption SDK기울일 수 있습니다. 는 다음 사항을 제공하여 이러한 질문에 AWS Encryption SDK 답합니다.

**암호화 모범 사례에 따른 기본 구현**  
기본적으로는 암호화하는 각 데이터 객체에 대해 고유한 데이터 키를 AWS Encryption SDK 생성합니다. 이는 각 암호화 작업에 고유한 데이터 키를 사용하는 암호화 모범 사례를 따릅니다.  
는 안전하고 인증된 대칭 키 알고리즘을 사용하여 데이터를 AWS Encryption SDK 암호화합니다. 자세한 내용은 [에서 지원되는 알고리즘 제품군 AWS Encryption SDK](supported-algorithms.md) 단원을 참조하십시오.

**래핑 키를 사용하여 데이터 키를 보호하기 위한 프레임워크**  
는 하나 이상의 래핑 키로 데이터를 암호화하여 데이터를 암호화하는 데이터 키를 AWS Encryption SDK 보호합니다. 는 둘 이상의 래핑 키로 데이터 키를 암호화하는 프레임워크를 제공하여 암호화된 데이터를 이식할 수 있도록 AWS Encryption SDK 합니다.  
예를 들어 AWS KMS key 의 AWS KMS 및 온프레미스 HSM의 키로 데이터를 암호화합니다. 어느 하나의 래핑 키를 사용할 수 없거나 호출자가 두 키를 모두 사용할 권한이 없는 경우 데이터를 복호화하는 데 두 래핑 키 중 어느 것을 사용해도 됩니다.

**암호화된 데이터와 함께 암호화된 데이터 키를 저장하는 형식 메시지**  
는 암호화된 데이터와 암호화된 데이터 키를 정의된 데이터 형식을 사용하는 [암호화된 메시지](concepts.md#message)에 함께 AWS Encryption SDK 저장합니다. 즉,에서 데이터를 암호화하는 데이터 키를 추적하거나 보호할 필요가 없습니다 AWS Encryption SDK .

의 일부 언어 구현에는 AWS SDK가 AWS Encryption SDK 필요하지만 에는 AWS Encryption SDK 가 필요하지 않으며 AWS 서비스에 종속 AWS 계정 되지 않습니다. 를 사용하여 데이터를 [AWS KMS keys](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#kms-keys) 보호하도록 선택한 AWS 계정 경우에만이 필요합니다.

## 오픈 소스 리포지토리에서 개발
<a name="esdk-repos"></a>

는 GitHub의 오픈 소스 리포지토리에서 개발 AWS Encryption SDK 됩니다. 이러한 리포지토리를 사용하여 코드를 보고, 문제를 읽고 제출하고, 언어 구현과 관련된 정보를 찾을 수 있습니다.
+ AWS Encryption SDK for C - [aws-encryption-sdk-c](https://github.com/aws/aws-encryption-sdk-c/)
+ AWS Encryption SDK for .NET - `aws-encryption-sdk`리포지토리의 [.NET](https://github.com/aws/aws-encryption-sdk/tree/mainline/AwsEncryptionSDK/runtimes/net/) 디렉터리입니다.
+ AWS 암호화 CLI - [aws-encryption-sdk-cli](https://github.com/aws/aws-encryption-sdk-cli/)
+ AWS Encryption SDK for Java - [aws-encryption-sdk-java](https://github.com/aws/aws-encryption-sdk-java/)
+ AWS Encryption SDK for JavaScript - [aws-encryption-sdk-javascript](https://github.com/aws/aws-encryption-sdk-javascript/)
+ AWS Encryption SDK for Python - [aws-encryption-sdk-python](https://github.com/aws/aws-encryption-sdk-python/)
+ AWS Encryption SDK for Rust - `aws-encryption-sdk`리포지토리의 [Rust](https://github.com/aws/aws-encryption-sdk-dafny/tree/mainline/AwsEncryptionSDK/runtimes/rust/) 디렉터리입니다.
+ AWS Encryption SDK for Go - `aws-encryption-sdk`리포지토리의 [Go](https://github.com/aws/aws-encryption-sdk/tree/mainline/releases/go/encryption-sdk/) 디렉터리

## 암호화 라이브러리 및 서비스와의 호환성
<a name="intro-compatibility"></a>

 AWS Encryption SDK 는 여러 [프로그래밍 언어로](programming-languages.md) 지원됩니다. 모든 언어 구현은 상호 연동이 가능합니다. 하나의 언어 구현으로 암호화하고 다른 언어 구현으로 복호화할 수 있습니다. 상호 연동성에는 언어 제약 조건이 적용될 수 있습니다. 이 경우 이러한 제약 조건은 언어 구현에 대한 주제에 설명되어 있습니다. 또한 암호화 및 복호화를 수행할 때는 호환되는 키링이나 마스터 키 및 마스터 키 공급자를 사용해야 합니다. 자세한 내용은 [키링 호환성](choose-keyring.md#keyring-compatibility)을 참조하세요.

그러나는 다른 라이브러리와 상호 작용할 AWS Encryption SDK 수 없습니다. 각 라이브러리는 암호화된 데이터를 다른 형식으로 반환하므로 한 라이브러리로 암호화하고 다른 라이브러리로 복호화할 수 없습니다.

**DynamoDB Encryption Client 및 Amazon S3 클라이언트 측 암호화**  <a name="ESDK-DDBEC"></a>
는 [DynamoDB Encryption Client](https://docs.aws.amazon.com/dynamodb-encryption-client/latest/devguide/) 또는 [Amazon S3 클라이언트 측 암호화](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingClientSideEncryption.html)로 암호화된 데이터를 해독할 수 AWS Encryption SDK 없습니다. 이러한 라이브러리는이 AWS Encryption SDK 반환하는 [암호화된 메시지를](concepts.md#message) 해독할 수 없습니다. 

**AWS Key Management Service (AWS KMS)**  <a name="ESDK-KMS"></a>
는 [AWS KMS keys](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys) 및 [데이터 키를](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#data-keys) 사용하여 다중 리전 KMS 키를 포함한 데이터를 보호할 AWS Encryption SDK 수 있습니다. 예를 들어의 하나 이상의 AWS KMS keys 에서 데이터를 암호화 AWS Encryption SDK 하도록를 구성할 수 있습니다 AWS 계정. 그러나 AWS Encryption SDK 를 사용하여 해당 데이터를 복호화해야 합니다.  
는 AWS KMS [암호화 또는 재암호화](https://docs.aws.amazon.com/kms/latest/APIReference/API_Encrypt.html) 작업이 반환하는 사이퍼텍스트를 해독할 수 AWS Encryption SDK 없습니다. [ReEncrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_ReEncrypt.html) 마찬가지로 AWS KMS [복호](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html)화 작업은이 AWS Encryption SDK 반환하는 [암호화된 메시지를](concepts.md#message) 복호화할 수 없습니다.  
는 [대칭 암호화 KMS 키](https://docs.aws.amazon.com/kms/latest/developerguide/symm-asymm-concepts.html#symmetric-cmks)만 AWS Encryption SDK 지원합니다. [비대칭 KMS 키](https://docs.aws.amazon.com/kms/latest/developerguide/symm-asymm-concepts.html#asymmetric-cmks)는 암호화 또는 AWS Encryption SDK로그인에 사용할 수 없습니다. AWS Encryption SDK 는 메시지에 서명하는 [알고리즘 제품군](supported-algorithms.md)에 대한 자체 ECDSA 서명 키를 생성합니다.

## 지원 및 유지 관리
<a name="support"></a>

 AWS Encryption SDK 는 버전 관리 및 수명 주기 단계를 포함하여 AWS SDK 및 도구가 사용하는 것과 동일한 [유지 관리 정책을](https://docs.aws.amazon.com/sdkref/latest/guide/maint-policy.html) 사용합니다. 프로그래밍 AWS Encryption SDK 언어에 사용할 수 있는 최신 버전의를 사용하고 새 버전이 릴리스되면 업그레이드하는 것이 [좋습니다](best-practices.md). 버전에 1.7.*x* 이전 AWS Encryption SDK 버전에서 버전 2.0.*x* 이상으로 업그레이드하는 등 중요한 변경이 필요한 경우 도움이 되는 [자세한 지침을](migration.md) 제공합니다.

의 각 프로그래밍 언어 구현 AWS Encryption SDK 은 별도의 오픈 소스 GitHub 리포지토리에서 개발됩니다. 각 버전의 수명 주기 및 지원 단계는 리포지토리마다 다를 수 있습니다. 예를 들어 특정 버전의 AWS Encryption SDK 는 한 프로그래밍 언어의 일반 가용성(전체 지원) 단계이지만 다른 프로그래밍 언어의 end-of-support 단계일 수 있습니다. 가능하면 완전히 지원되는 버전을 사용하고 더 이상 지원되지 않는 버전은 피하는 것이 좋습니다.

프로그래밍 언어에 맞는 AWS Encryption SDK 버전의 수명 주기 단계를 찾으려면 각 AWS Encryption SDK 리포지토리의 `SUPPORT_POLICY.rst` 파일을 참조하세요.
+ AWS Encryption SDK for C - [SUPPORT\$1POLICY.rst](https://github.com/aws/aws-encryption-sdk-c/blob/master/SUPPORT_POLICY.rst)
+ AWS Encryption SDK .NET용 - [SUPPORT\$1POLICY.rst](https://github.com/aws/aws-encryption-sdk-dafny/blob/mainline/SUPPORT_POLICY.rst)
+ AWS 암호화 CLI - [SUPPORT\$1POLICY.rst](https://github.com/aws/aws-encryption-sdk-cli/blob/master/SUPPORT_POLICY.rst)
+ AWS Encryption SDK for Java - [SUPPORT\$1POLICY.rst](https://github.com/aws/aws-encryption-sdk-java/blob/master/SUPPORT_POLICY.rst)
+ AWS Encryption SDK for JavaScript - [SUPPORT\$1POLICY.rst](https://github.com/aws/aws-encryption-sdk-javascript/blob/master/SUPPORT_POLICY.rst)
+ AWS Encryption SDK for Python - [SUPPORT\$1POLICY.rst](https://github.com/aws/aws-encryption-sdk-python/blob/master/SUPPORT_POLICY.rst)

자세한 내용은 SDK 및 도구 참조 안내서의 [의 버전 AWS Encryption SDK](about-versions.md) AWS SDKs. [AWS SDKs ](https://docs.aws.amazon.com/sdkref/latest/guide/maint-policy.html) 

## 자세히 알아보기
<a name="intro-see-also"></a>

 AWS Encryption SDK 및 클라이언트 측 암호화에 대한 자세한 내용은 다음 소스를 참조하십시오.
+ 이 SDK에서 사용되는 용어 및 개념에 대한 도움말은 [의 개념 AWS Encryption SDK](concepts.md) 섹션을 참조하세요.
+ 모범 사례 지침은 [모범 사례 AWS Encryption SDK](best-practices.md) 섹션을 참조하세요.
+ 이 SDK의 작동 방식에 대한 자세한 내용은 [SDK 작동 방식](how-it-works.md) 섹션을 참조하세요.
+ 에서 옵션을 구성하는 방법을 보여주는 예제는 섹션을 AWS Encryption SDK참조하세요[구성 AWS Encryption SDK](configure.md).
+ 자세한 기술 정보는 [AWS Encryption SDK 참조](reference.md) 섹션을 참조하세요.
+ 의 기술 사양은 GitHub의 [AWS Encryption SDK 사양을](https://github.com/awslabs/aws-encryption-sdk-specification/) AWS Encryption SDK참조하세요.
+ 사용에 대한 질문에 대한 답변을 보려면 [AWS Crypto 도구 토론 포럼](https://forums.aws.amazon.com/forum.jspa?forumID=302)을 AWS Encryption SDK읽고 게시하십시오.

다양한 프로그래밍 언어로를 구현하는 AWS Encryption SDK 방법에 대한 정보입니다.
+ **C**: GitHub의 , [AWS Encryption SDK for C](c-language.md) AWS Encryption SDK [C 설명서](https://aws.github.io/aws-encryption-sdk-c/html/) 및 [aws-encryption-sdk-c](https://github.com/aws/aws-encryption-sdk-c/) 리포지토리를 참조하세요.
+ **C\$1/.NET: [AWS Encryption SDK .NET용](dot-net.md) 문서와, GitHub에 있는 `aws-encryption-sdk` 리포지토리의 [aws-encryption-sdk-net](https://github.com/aws/aws-encryption-sdk/tree/mainline/AwsEncryptionSDK/runtimes/net/)** 디렉터리를 참조하세요.
+ **명령줄 인터페이스**: [AWS Encryption SDK 명령줄 인터페이스](crypto-cli.md), AWS 암호화 CLI[용 문서 읽기](https://aws-encryption-sdk-cli.readthedocs.io/en/latest/) 및 GitHub의 [aws-encryption-sdk-cli](https://github.com/aws/aws-encryption-sdk-cli/) 리포지토리를 참조하세요.
+ **Java**: GitHub의 [AWS Encryption SDK for Java](java.md), AWS Encryption SDK [Javadoc](https://aws.github.io/aws-encryption-sdk-java/) 및 [aws-encryption-sdk-java](https://github.com/aws/aws-encryption-sdk-java/) 리포지토리를 참조하세요.

  **JavaScript**: GitHub의 [AWS Encryption SDK for JavaScript](javascript.md) 및 [aws-encryption-sdk-javascript](https://github.com/aws/aws-encryption-sdk-javascript/) 리포지토리를 참조하세요.
+ **Python**: GitHub의 [AWS Encryption SDK for Python](python.md), AWS Encryption SDK [Python 설명서](https://aws-encryption-sdk-python.readthedocs.io/en/latest/) 및 [aws-encryption-sdk-python](https://github.com/aws/aws-encryption-sdk-python/) 리포지토리를 참조하세요.

## 피드백 보내기
<a name="report-issues"></a>

우리는 여러분의 의견을 환영합니다. 질문이나 의견이 있거나 보고해야 할 문제가 있는 경우 다음 리소스를 사용하세요.
+ 에서 잠재적 보안 취약성을 발견한 경우 [AWS 보안에 알리](https://aws.amazon.com/security/vulnerability-reporting/) AWS Encryption SDK세요. 공개적으로 GitHub 문제를 작성하지 마세요.
+ 에 대한 피드백을 제공하려면 사용 중인 프로그래밍 언어에 대한 문제를 GitHub 리포지토리에 AWS Encryption SDK제출합니다.
+ 이 문서에 대한 피드백을 제공하려면 이 페이지의 **피드백** 링크를 사용하세요. GitHub에서 이 문서의 오픈 소스 리포지토리인 [aws-encryption-sdk-docs](https://github.com/awsdocs/aws-encryption-sdk-docs)에 문제를 제기하거나 기고할 수도 있습니다.

# 의 개념 AWS Encryption SDK
<a name="concepts"></a>

이 섹션에서는에 사용되는 개념을 소개 AWS Encryption SDK하고 용어집과 참조를 제공합니다. 의 AWS Encryption SDK 작동 방식과 이를 설명하는 데 사용하는 용어를 이해하는 데 도움이 되도록 설계되었습니다.

도움이 필요하세요?
+ 가 [봉투 암호화](#envelope-encryption)를 AWS Encryption SDK 사용하여 데이터를 보호하는 방법을 알아봅니다.
+ 봉투 암호화의 구성 요소인 데이터를 보호하는 [데이터 키](#DEK)와 데이터 키를 보호하는 [래핑 키](#master-key)에 대해 알아봅니다.
+ 사용하는 래핑 키를 결정하는 [키링](#keyring)과 [마스터 키 공급자](#master-key-provider)에 대해 알아봅니다.
+ 암호화 프로세스에 무결성을 더하는 [암호화 컨텍스트](#encryption-context)에 대해 알아봅니다. 이는 선택 사항이지만 권장되는 모범 사례입니다.
+ 암호화 메서드가 반환하는 [암호화된 메시지](#message)에 대해 알아봅니다.
+ 그런 다음 원하는 [프로그래밍 언어로](programming-languages.md) AWS Encryption SDK 를 사용할 준비가 되었습니다.

**Topics**
+ [봉투 암호화](#envelope-encryption)
+ [데이터 키](#DEK)
+ [래핑 키](#master-key)
+ [키링 및 마스터 키 공급자](#keyring)
+ [암호화 컨텍스트](#encryption-context)
+ [암호화된 메시지](#message)
+ [알고리즘 제품군](#crypto-algorithm)
+ [암호화 구성 요소 관리자](#crypt-materials-manager)
+ [대칭 및 비대칭 암호화](#symmetric-key-encryption)
+ [키 커밋](#key-commitment)
+ [커밋 정책](#commitment-policy)
+ [디지털 서명](#digital-sigs)

## 봉투 암호화
<a name="envelope-encryption"></a>

암호화된 데이터의 보안은 부분적으로 복호화할 수 있는 데이터 키를 보호하는 데 달려 있습니다. 데이터 키를 보호하기 위해 널리 인정되는 모범 사례 중 하나는 데이터 키를 암호화하는 것입니다. 이렇게 하려면 *키-암호화 키* 또는 [래핑 키](#master-key)라고 하는 또 다른 암호화 키가 필요합니다. 래핑 키를 사용하여 데이터 키를 암호화하는 방법을 *봉투 암호화*라고 합니다.

**데이터 키 보호**  
는 고유한 데이터 키로 각 메시지를 AWS Encryption SDK 암호화합니다. 그러면 지정한 래핑 키에서 데이터 키가 암호화됩니다. 반환된 암호화된 메시지에 암호화된 데이터와 함께 암호화된 데이터 키를 저장합니다.  
래핑 키를 지정하려면 [키링](#keyring) 또는 [마스터 키 공급자](#master-key-provider)를 사용합니다.  

![\[를 사용한 봉투 암호화 AWS Encryption SDK\]](http://docs.aws.amazon.com/ko_kr/encryption-sdk/latest/developer-guide/images/envelope-encryption-70.png)


**여러 개의 래핑 키로 동일한 데이터 암호화**  
여러 개의 래핑 키로 데이터 키를 암호화할 수 있습니다. 사용자마다 다른 래핑 키를 제공하거나, 유형이나 위치가 다른 래핑 키를 제공할 수 있습니다. 각 래핑 키는 동일한 데이터 키를 암호화합니다. 는 암호화된 모든 데이터 키를 암호화된 데이터와 함께 암호화된 메시지에 AWS Encryption SDK 저장합니다.  
데이터를 복호화하려면 암호화된 데이터 키 중 하나를 복호화할 수 있는 래핑 키를 제공해야 합니다.  

![\[각 래핑 키가 동일한 데이터 키를 암호화하여 각 래핑 키에 대해 하나의 암호화된 데이터 키가 생성됨\]](http://docs.aws.amazon.com/ko_kr/encryption-sdk/latest/developer-guide/images/multiple-wrapping-keys-70.png)


**여러 알고리즘의 강점 결합**  
기본적으로 데이터를 암호화하기 위해는 AES-GCM 대칭 암호화, 키 유도 함수(HKDF) 및 서명이 포함된 정교한 [알고리즘 제품군](supported-algorithms.md)을 AWS Encryption SDK 사용합니다. 데이터 키를 암호화하려면 래핑 키에 적합한 [대칭 또는 비대칭 암호화 알고리즘](#symmetric-key-encryption)을 지정할 수 있습니다.  
일반적으로 대칭 키 암호화 알고리즘이 비대칭 또는 *퍼블릭 키 암호화*보다 빠르고 더 작은 사이퍼텍스트를 생성합니다. 그러나 퍼블릭 키 알고리즘은 고유한 역할 구분을 제공하고 키 관리가 더 쉽습니다. 각각의 장점을 결합하려면 대칭 키 암호화로 데이터를 암호화한 다음 퍼블릭 키 암호화로 데이터 키를 암호화하면 됩니다.

## 데이터 키
<a name="DEK"></a>

*데이터 키*는 AWS Encryption SDK 가 데이터를 암호화하는 데 사용하는 암호화 키입니다. 각 데이터 키는 암호화 키 요구 사항을 준수하는 바이트 배열입니다. [데이터 키 캐싱을](data-key-caching.md) 사용하지 않는 한는 고유한 데이터 키를 AWS Encryption SDK 사용하여 각 메시지를 암호화합니다.

데이터 키를 지정, 생성, 구현, 확장, 보호 또는 사용할 필요가 없습니다. 암호화 및 복호화 작업을 호출할 때 AWS Encryption SDK 가 이를 대신 수행합니다.

데이터 키를 보호하기 위해 AWS Encryption SDK 는 [래핑](#master-key) 키 또는 마스터 키라고 하는 하나 이상의 *키 암호화* 키로 암호화합니다. 는 일반 텍스트 데이터 키를 AWS Encryption SDK 사용하여 데이터를 암호화한 후 가능한 한 빨리 메모리에서 제거합니다. 그런 다음 암호화 작업이 반환하는 [암호화된 메시지](#message)에 암호화된 데이터와 함께 암호화된 데이터 키를 저장합니다. 자세한 내용은 [AWS Encryption SDK 작동 방식](how-it-works.md)을 참조하세요.

**작은 정보**  
에서는 *데이터 키*와 *데이터 암호화 키를* AWS Encryption SDK구분합니다. 기본 제품군을 포함하여 지원되는 [알고리즘 제품군](#crypto-algorithm) 중 일부는 데이터 키가 암호화 한도에 도달하지 않도록 하는 [키 유도 함수](https://en.wikipedia.org/wiki/Key_derivation_function)를 사용합니다. 키 유도 함수는 데이터 키를 입력으로 받아 실제로 데이터를 암호화하는 데 사용되는 데이터 암호화 키를 반환합니다. 이러한 이유로 데이터가 데이터 키에 "의해" 암호화되는 것이 아니라 데이터 키"에서" 암호화된다고 말하는 경우가 많습니다.

암호화된 각 데이터 키에는 해당 데이터 키를 암호화한 래핑 키의 식별자를 비롯한 메타데이터가 포함됩니다. 이 메타데이터 AWS Encryption SDK 를 사용하면에서 복호화 시 유효한 래핑 키를 더 쉽게 식별할 수 있습니다.

## 래핑 키
<a name="master-key"></a>

*래핑 키*는 AWS Encryption SDK 가 데이터를 암호화하는 [데이터 키](#DEK)를 암호화하는 데 사용하는 키-암호화 키입니다. 각각의 일반 텍스트 데이터 키는 한 개 또는 여러 개의 래핑 키로 암호화될 수 있습니다. [키링](#keyring) 또는 [마스터 키 공급자](#master-key-provider)를 구성할 때 데이터를 보호하기 위해 사용할 래핑 키를 결정합니다.

**참고**  
*래핑 키*는 키링 또는 마스터 키 공급자에 있는 키를 말합니다. *마스터 키*는 일반적으로 마스터 키 공급자를 사용할 때 인스턴스화하는 `MasterKey` 클래스와 연결됩니다.

는 (AWS KMS) 대칭[AWS KMS keys](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys)(다중 리전 KMS 키 AWS Key Management Service 포함), 원시 AES-GCM(고급 암호화 표준/갈루아 카운터 모드) 키, 원시 RSA 키 등 일반적으로 사용되는 여러 래핑 키를 AWS Encryption SDK 지원합니다. [다중 리전 사용 AWS KMS keys](configure.md#config-mrks) 또한 자체 래핑 키를 확장하거나 구현할 수도 있습니다.

봉투 암호화를 사용할 때는 래핑 키를 무단 액세스로부터 보호해야 합니다. 다음 중 한 가지 방법으로 이를 수행할 수 있습니다.
+ [AWS Key Management Service (AWS KMS)](https://aws.amazon.com/kms/)와 같이 이러한 용도로 설계된 웹 서비스를 사용합니다.
+ [AWS CloudHSM](https://aws.amazon.com/cloudhsm/)에서 제공하는 것과 같은 [하드웨어 보안 모듈(HSM)](https://en.wikipedia.org/wiki/Hardware_security_module)을 사용합니다.
+ 다른 키 관리 도구 및 서비스를 사용합니다.

키 관리 시스템이 없는 경우를 사용하는 것이 좋습니다 AWS KMS. 는 AWS Encryption SDK 와 통합되어 래핑 키를 보호하고 사용하는 AWS KMS 데 도움이 됩니다. 그러나 AWS Encryption SDK 에는 AWS 또는 AWS 서비스가 필요하지 않습니다.

## 키링 및 마스터 키 공급자
<a name="keyring"></a>

암호화 및 복호화에 사용하는 래핑 키를 지정하려면 키링 또는 마스터 키 공급자를 사용합니다. 에서 AWS Encryption SDK 제공하거나 자체 구현을 설계하는 키링 및 마스터 키 공급자를 사용할 수 있습니다. AWS Encryption SDK 는 언어 제약 조건에 따라 서로 호환되는 키링과 마스터 키 공급자를 제공합니다. 자세한 내용은 [키링 호환성](choose-keyring.md#keyring-compatibility)을 참조하세요.

*키링*은 데이터 키를 생성, 암호화, 복호화합니다. 키링을 정의할 때 데이터 키를 암호화하는 [래핑 키](#master-key)를 지정할 수 있습니다. 대부분의 키링은 하나 이상의 래핑 키를 지정하거나, 래핑 키를 제공하고 보호하는 서비스를 지정합니다. 래핑 키가 없는 키링을 정의하거나 추가 구성 옵션을 사용하여 더 복잡한 키링을 정의할 수도 있습니다. 에서 AWS Encryption SDK 정의하는 키링을 선택하고 사용하는 데 도움이 필요하면 섹션을 참조하세요[키링](choose-keyring.md).

키링은 다음 프로그래밍 언어로 지원됩니다.
+ AWS Encryption SDK for C
+ AWS Encryption SDK for JavaScript
+ AWS Encryption SDK .NET용
+ 의 버전 3.*x* AWS Encryption SDK for Java
+ 선택적 [암호화 자료 공급자 라이브러리](https://github.com/aws/aws-cryptographic-material-providers-library)(MPL) 종속성과 함께 사용하는 AWS Encryption SDK for Python경우 버전 4.*x*.
+  AWS Encryption SDK for Rust 버전 1.*x* 
+ Go AWS Encryption SDK 용의 버전 0.1.*x* 이상

*마스터 키 공급자*는 키링의 대안입니다. 마스터 키 공급자는 지정한 래핑 키(또는 마스터 키)를 반환합니다. 각 마스터 키는 하나의 마스터 키 공급자와 연결되지만 마스터 키 공급자는 일반적으로 여러 마스터 키를 제공합니다. 마스터 키 공급자는 Java, Python 및 AWS Encryption CLI에서 지원됩니다.

암호화를 위해 키링(또는 마스터 키 공급자)을 지정해야 합니다. 복호화를 위해 동일한 키링(또는 마스터 키 공급자)을 지정하거나 다른 키링을 지정할 수 있습니다. 암호화할 때 AWS Encryption SDK 는 지정한 모든 래핑 키를 사용하여 데이터 키를 암호화합니다. 복호화할 때 AWS Encryption SDK 는 사용자가 지정한 래핑 키만 사용하여 암호화된 데이터 키를 복호화합니다. 복호화를 위한 래핑 키 지정은 선택 사항이지만 AWS Encryption SDK [모범 사례](best-practices.md)입니다.

래핑 키 지정에 대한 자세한 내용은 [래핑 키 선택](configure.md#config-keys) 섹션을 참조하세요.

## 암호화 컨텍스트
<a name="encryption-context"></a>

암호화 작업의 보안을 개선하려면 모든 데이터 암호화 요청에 암호화 컨텍스트를 포함시킵니다. 암호화 컨텍스트를 사용하는 것은 선택 사항이지만 권장되는 암호화 모범 사례입니다.

*암호화 컨텍스트*는 비밀이 아닌 임의의 추가 인증 데이터를 포함하는 키-값 페어 세트입니다. 암호화 컨텍스트에는 사용자가 선택한 모든 데이터가 포함될 수 있지만 일반적으로 파일 유형, 목적 또는 소유권에 대한 데이터와 같이 로깅 및 추적에 유용한 데이터로 구성됩니다. 데이터를 암호화하면 암호화 컨텍스트는 암호화된 데이터에 암호화 방식으로 바인딩되므로 데이터를 복호화할 때 동일한 암호화 컨텍스트가 필요합니다. 또한 AWS Encryption SDK 는 반환하는 [암호화된 메시지](#message)의 헤더에 암호화 컨텍스트를 일반 텍스트로 포함시킵니다.

에서 AWS Encryption SDK 사용하는 암호화 컨텍스트는 지정한 암호화 컨텍스트와 [암호화 자료 관리자](#crypt-materials-manager)(CMM)가 추가하는 퍼블릭 키 페어로 구성됩니다. 특히, [서명이 포함된 암호화 알고리즘](algorithms-reference.md)을 사용할 때마다 CMM은 예약된 이름(`aws-crypto-public-key`)과 퍼블릭 확인 키를 나타내는 값으로 구성된 이름-값 페어를 암호화 컨텍스트에 추가합니다. 암호화 컨텍스트의 `aws-crypto-public-key` 이름은에서 예약 AWS Encryption SDK 하며 암호화 컨텍스트의 다른 페어에서 이름으로 사용할 수 없습니다. 자세한 내용은 *메시지 형식 참조*의 [AAD](message-format.md#header-aad)를 참조하세요.

다음 예제 암호화 컨텍스트는 요청에서 지정된 두 개의 암호화 컨텍스트 페어와 CMM이 추가하는 퍼블릭 키 페어로 구성되어 있습니다.

```
"Purpose"="Test", "Department"="IT", aws-crypto-public-key=<public key>
```

데이터를 복호화하려면 암호화된 메시지를 전달합니다. 는 암호화된 메시지 헤더에서 암호화 컨텍스트를 추출할 AWS Encryption SDK 수 있으므로 암호화 컨텍스트를 별도로 제공할 필요가 없습니다. 하지만 암호화 컨텍스트는 암호화된 메시지를 올바르게 복호화하고 있는지 확인하는 데 도움이 될 수 있습니다.
+ [AWS Encryption SDK Command Line Interface(CLI)](crypto-cli.md)에서 복호화 명령에 암호화 컨텍스트를 제공하는 경우 CLI는 일반 텍스트 데이터를 반환하기 전에 암호화된 메시지의 암호화 컨텍스트에 해당 값이 있는지 확인합니다.
+ 다른 프로그래밍 언어 구현의 경우 복호화 응답에 암호화 컨텍스트와 일반 텍스트 데이터가 포함됩니다. 애플리케이션의 복호화 함수는 일반 텍스트 데이터를 반환하기 전에 항상 복호화 응답의 암호화 컨텍스트에 암호화 요청(또는 하위 집합)의 암호화 컨텍스트가 포함되어 있는지 확인해야 합니다.

**참고**  
다음 버전은 모든 [암호화 요청에서 암호화 컨텍스트를 요구하는 데 사용할 수 있는 필수 암호화 컨텍스트 CMM](configure.md#config-required-encryption-context-cmm)을 지원합니다.  
의 버전 3.*x* AWS Encryption SDK for Java
for .NET 버전 AWS Encryption SDK 4.*x* 이상
선택적 [암호화 자료 공급자 라이브러리](https://github.com/aws/aws-cryptographic-material-providers-library)(MPL) 종속성과 함께 사용되는 AWS Encryption SDK for Python경우 버전 4.*x*.
 AWS Encryption SDK for Rust 버전 1.*x* 
Go AWS Encryption SDK 용의 버전 0.1.*x* 이상

암호화 컨텍스트를 선택할 때는 해당 값이 비밀이 아님을 기억해야 합니다. 암호화 컨텍스트는 AWS Encryption SDK 가 반환하는 [암호화된 메시지](#message)의 헤더에 일반 텍스트로 표시됩니다. AWS Key Management Service를 사용하는 경우 암호화 컨텍스트는와 같은 감사 레코드 및 로그에 일반 텍스트로 표시될 수도 있습니다 AWS CloudTrail.

코드에서 암호화 컨텍스트를 제출하고 확인하는 예제는 선호하는 [프로그래밍 언어](programming-languages.md)의 예제를 참조하세요.

## 암호화된 메시지
<a name="message"></a>

로 데이터를 암호화하면 암호화된 메시지가 반환 AWS Encryption SDK됩니다.

*암호화된 메시지*는 암호화된 데이터와 함께 데이터 키의 암호화된 사본, 알고리즘 ID, 선택 사항으로 [암호화 컨텍스트](#encryption-context)와 [디지털 서명](#digital-sigs)을 포함하는 이동 가능한 [형식화된 데이터 구조](message-format.md)입니다. AWS Encryption SDK 의 암호화 작업은 암호화된 메시지를 반환하고 복호화 작업은 암호화된 메시지를 입력으로 사용합니다.

암호화된 데이터와 암호화된 데이터 키를 결합하면 복호화 작업이 간소화되고, 암호화된 데이터 키를 암호화 데이터와 독립적으로 저장하고 관리할 필요가 없습니다.

암호화된 메시지에 대한 기술 정보는 [암호화된 메시지 형식](message-format.md)을 참조하세요.

## 알고리즘 제품군
<a name="crypto-algorithm"></a>

는 알고리즘 제품군을 AWS Encryption SDK 사용하여 암호화 및 복호화 작업이 반환하는 [암호화된 메시지](#message)의 데이터를 암호화하고 서명합니다. AWS Encryption SDK 에서는 여러 [알고리즘 제품군](supported-algorithms.md)을 지원합니다. 지원하는 알고리즘은 모두 AES(Advanced Encryption Standard)를 기본 알고리즘으로 사용하고 이 기본 알고리즘을 다른 알고리즘 및 값과 조합합니다.

는 모든 암호화 작업의 기본값으로 권장 알고리즘 제품군을 AWS Encryption SDK 설정합니다. 기본값은 표준과 모범 사례가 개선됨에 따라 변경될 수 있습니다. 데이터 암호화 요청이나 [암호화 구성 요소 관리자(CMM)](#crypt-materials-manager)를 생성할 때 대체 알고리즘 제품군을 지정할 수 있지만 상황에 따라 대안이 필요한 경우가 아니라면 기본값을 사용하는 것이 가장 좋습니다. 현재 기본값은 HMAC 기반 추출 및 확장 [키 유도 함수](https://en.wikipedia.org/wiki/HKDF)([HKDF](https://en.wikipedia.org/wiki/HKDF)), [키 커밋](#key-commitment), [타원 곡선 디지털 서명 알고리즘(ECDSA)](#digital-sigs) 서명, 256비트 암호화 키를 갖춘 AES-GCM입니다.

애플리케이션에 고성능이 필요하고 데이터를 암호화하는 사용자와 데이터를 복호화하는 사용자의 신뢰도가 동일하다면 디지털 서명이 없는 알고리즘 제품군을 지정하는 것을 고려할 수 있습니다. 하지만 키 커밋과 키 유도 함수가 포함된 알고리즘 제품군을 사용하는 것을 적극 권장합니다. 이러한 기능이 없는 알고리즘 제품군은 이하 버전과의 호환성을 위해서만 지원됩니다.

## 암호화 구성 요소 관리자
<a name="crypt-materials-manager"></a>

암호화 구성 요소 관리자(CMM)는 데이터를 암호화하고 복호화하는 데 사용되는 암호화 구성 요소를 조합합니다. *암호화 구성 요소*에는 일반 텍스트 및 암호화된 데이터 키와 선택 사항인 메시지 서명 키가 포함됩니다. 사용자는 CMM과 직접 상호 작용하지는 않습니다. 암호화 및 복호화 메서드가 이를 대신 처리합니다.

에서 AWS Encryption SDK 제공하는 기본 CMM 또는 [캐싱 CMM](data-key-caching.md)을 사용하거나 사용자 지정 CMM을 작성할 수 있습니다. 그리고 CMM을 지정할 수 있지만 필수는 아닙니다. 키링 또는 마스터 키 공급자를 지정하면가 기본 CMM을 AWS Encryption SDK 생성합니다. 기본 CMM은 사용자가 지정한 키링 또는 마스터 키 공급자로부터 암호화 또는 복호화 구성 요소를 가져옵니다. 여기에는 [AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/)(AWS KMS)와 같은 암호화 서비스에 대한 호출이 포함될 수 있습니다.

CMM은 AWS Encryption SDK 와 키링(또는 마스터 키 공급자) 간의 연결 역할을 하기 때문에 정책 적용 및 캐싱 지원과 같은 사용자 지정 및 확장을 위한 이상적인 지점입니다. 는 데이터 키 캐싱을 지원하는 캐싱 CMM을 AWS Encryption SDK 제공합니다. [데이터 키 캐싱](data-key-caching.md) 

## 대칭 및 비대칭 암호화
<a name="symmetric-key-encryption"></a>

*대칭 암호화*는 동일한 키를 사용하여 데이터를 암호화하고 복호화합니다.

*비대칭 암호화*는 수학적으로 관련된 데이터 키 페어를 사용합니다. 페어의 키 중 하나가 데이터를 암호화하고, 페어의 다른 키만 데이터를 복호화할 수 있습니다.

는 [봉투 암호화](#envelope-encryption)를 AWS Encryption SDK 사용합니다. 대칭 데이터 키로 데이터를 암호화합니다. 하나 이상의 대칭 또는 비대칭 래핑 키를 사용하여 대칭 데이터 키를 암호화합니다. 암호화된 데이터와 하나 이상의 데이터 키의 암호화된 사본이 포함된 [암호화된 메시지](#message)를 반환합니다.

**데이터 암호화(대칭 암호화)**  
는 대칭 [데이터 키](#DEK)와 대칭 암호화 [알고리즘이 포함된 알고리즘 제품군](#crypto-algorithm)을 AWS Encryption SDK 사용하여 데이터를 암호화합니다. 데이터를 해독하기 위해는 동일한 데이터 키와 동일한 알고리즘 제품군을 AWS Encryption SDK 사용합니다.

**데이터 키 암호화(대칭 또는 비대칭 암호화)**  
암호화 및 복호화 작업에 제공하는 [키링](#keyring) 또는 [마스터 키 공급자](#master-key-provider)에 따라 대칭 데이터 키가 암호화 및 복호화되는 방식이 결정됩니다. 키링 또는 키링과 같은 대칭 암호화를 사용하는 마스터 AWS KMS 키 공급자 또는 원시 RSA 키링 또는와 같은 비대칭 암호화를 사용하는 키링 또는 마스터 키 공급자를 선택할 수 있습니다`JceMasterKey`.

## 키 커밋
<a name="key-commitment"></a>

는 각 사이퍼텍스트를 단일 일반 텍스트로만 해독할 수 있도록 보장하는 보안 속성인 *키 커*밋(강*력성*이라고도 함)을 AWS Encryption SDK 지원합니다. 이를 위해 키 커밋은 메시지를 암호화한 데이터 키만 복호화에 사용되도록 보장합니다. 키 커밋으로 데이터를 암호화하고 복호화하는 것이 [AWS Encryption SDK 모범 사례](best-practices.md)입니다.

AES를 포함한 대부분의 최신 대칭 암호는 AWS Encryption SDK 가 각 일반 텍스트 메시지를 암호화하는 데 사용하는 [고유 데이터 키](#DEK)와 같은 단일 비밀 키로 일반 텍스트를 암호화합니다. 동일한 데이터 키로 이 데이터를 복호화하면 원본과 동일한 일반 텍스트가 반환됩니다. 다른 키를 사용한 복호화는 일반적으로 실패합니다. 하지만 서로 다른 두 개의 키로 사이퍼텍스트를 복호화할 수 있습니다. 드문 경우이긴 하지만, 몇 바이트의 사이퍼텍스트를 다르지만 여전히 식별할 수 있는 일반 텍스트로 복호화할 수 있는 키를 찾는 경우가 있습니다.

는 AWS Encryption SDK 항상 하나의 고유한 데이터 키로 각 일반 텍스트 메시지를 암호화합니다. 여러 래핑 키(또는 마스터 키)로 해당 데이터 키를 암호화할 수 있지만 래핑 키는 항상 동일한 데이터 키를 암호화합니다. 하지만 정교하고 수동으로 조작된 [암호화된 메시지](#message)에는 실제로 각각 다른 래핑 키로 암호화된 서로 다른 데이터 키가 포함될 수 있습니다. 예를 들어 한 사용자가 암호화된 메시지를 복호화하여 0x0(false)이 반환됐지만 동일한 암호화된 메시지를 다른 사용자가 복호화하면 0x1(true)이 반환될 수 있습니다.

이 시나리오를 방지하기 위해는 암호화 및 복호화 시 키 커밋을 AWS Encryption SDK 지원합니다. 는 키 커밋으로 메시지를 AWS Encryption SDK 암호화할 때 암호화 텍스트를 생성한 고유한 데이터 키를 비밀이 아닌 데이터 키 식별자인 *키 커밋 문자열*에 암호화 방식으로 바인딩합니다. 그런 다음 암호화된 메시지의 메타데이터에 키 커밋 문자열을 저장합니다. 키 커밋으로 메시지를 복호화하면 AWS Encryption SDK 는 데이터 키가 암호화된 메시지의 유일한 키인지 확인합니다. 데이터 키 확인에 실패하면 복호화 작업이 실패합니다.

키 커밋에 대한 지원은 버전 1.7.*x*에 도입되었으며, 키 커밋으로 메시지를 복호화할 수는 있지만 키 커밋으로 암호화하지는 않습니다. 이 버전을 사용하면 키 커밋으로 사이퍼텍스트를 복호화하는 기능을 완전히 배포할 수 있습니다. 버전 2.0.*x*에서는 키 커밋이 완전히 지원됩니다. 기본적으로 키 커밋을 통해서만 암호화하고 복호화합니다. 이는 이전 버전의 로 암호화된 사이퍼텍스트를 해독할 필요가 없는 애플리케이션에 이상적인 구성입니다 AWS Encryption SDK.

키 커밋을 통한 암호화 및 복호화가 모범 사례이기는 하지만, 사용 시기를 직접 결정하고 적용 속도를 조정할 수 있습니다. 버전 1.7.*x*부터는 [기본 알고리즘 제품군](supported-algorithms.md)을 설정하고 사용할 수 있는 알고리즘 제품군을 제한하는 [커밋 정책을](#commitment-policy) AWS Encryption SDK 지원합니다. 이 정책은 키 커밋으로 데이터를 암호화 및 복호화할지 여부를 결정합니다.

키 커밋을 사용하면 [암호화된 메시지 크기가 약간 더 커지며(\$1 30바이트)](message-format.md) 처리하는 데 시간이 더 걸립니다. 애플리케이션이 크기나 성능에 매우 민감한 경우 키 커밋을 사용하지 않도록 설정할 수 있습니다. 하지만 꼭 필요한 경우에만 이를 설정하세요.

키 커밋 기능을 포함하여 버전 1.7.*x* 및 2.0.*x*로 마이그레이션하는 방법에 대한 자세한 내용은 [마이그레이션 AWS Encryption SDK](migration.md) 섹션을 참조하세요. 키 커밋에 대한 기술 정보는 [AWS Encryption SDK 알고리즘 참조](algorithms-reference.md) 및 [AWS Encryption SDK 메시지 형식 참조](message-format.md) 섹션을 참조하세요.

## 커밋 정책
<a name="commitment-policy"></a>

*커밋 정책*은 애플리케이션이 [키 커밋](#key-commitment)을 사용하여 암호화 및 복호화할지 여부를 결정하는 구성 설정입니다. 키 커밋으로 데이터를 암호화하고 복호화하는 것이 [AWS Encryption SDK 모범 사례](best-practices.md)입니다.

커밋 정책에는 세 가지 값이 있습니다.

**참고**  
전체 표를 보려면 가로 또는 세로로 스크롤해야 할 수 있습니다.


**커밋 정책 값**  

| 값 | 키 커밋으로 암호화 | 키 커밋 없이 암호화 | 키 커밋으로 복호화 | 키 커밋 없이 복호화 | 
| --- | --- | --- | --- | --- | 
| ForbidEncryptAllowDecrypt | ![\[Red circle with white X inside, indicating prohibition or cancellation.\]](http://docs.aws.amazon.com/ko_kr/encryption-sdk/latest/developer-guide/images/icon-no.png)  | ![\[Green checkmark icon indicating approval or confirmation.\]](http://docs.aws.amazon.com/ko_kr/encryption-sdk/latest/developer-guide/images/icon-yes.png)  | ![\[Green checkmark icon indicating approval or confirmation.\]](http://docs.aws.amazon.com/ko_kr/encryption-sdk/latest/developer-guide/images/icon-yes.png) | ![\[Green checkmark icon indicating approval or confirmation.\]](http://docs.aws.amazon.com/ko_kr/encryption-sdk/latest/developer-guide/images/icon-yes.png) | 
| RequireEncryptAllowDecrypt | ![\[Green checkmark icon indicating approval or confirmation.\]](http://docs.aws.amazon.com/ko_kr/encryption-sdk/latest/developer-guide/images/icon-yes.png) | ![\[Red circle with white X inside, indicating prohibition or cancellation.\]](http://docs.aws.amazon.com/ko_kr/encryption-sdk/latest/developer-guide/images/icon-no.png) | ![\[Green checkmark icon indicating approval or confirmation.\]](http://docs.aws.amazon.com/ko_kr/encryption-sdk/latest/developer-guide/images/icon-yes.png) | ![\[Green checkmark icon indicating approval or confirmation.\]](http://docs.aws.amazon.com/ko_kr/encryption-sdk/latest/developer-guide/images/icon-yes.png) | 
| RequireEncryptRequireDecrypt | ![\[Green checkmark icon indicating approval or confirmation.\]](http://docs.aws.amazon.com/ko_kr/encryption-sdk/latest/developer-guide/images/icon-yes.png) | ![\[Red circle with white X inside, indicating prohibition or cancellation.\]](http://docs.aws.amazon.com/ko_kr/encryption-sdk/latest/developer-guide/images/icon-no.png) | ![\[Green checkmark icon indicating approval or confirmation.\]](http://docs.aws.amazon.com/ko_kr/encryption-sdk/latest/developer-guide/images/icon-yes.png) | ![\[Red circle with white X inside, indicating prohibition or cancellation.\]](http://docs.aws.amazon.com/ko_kr/encryption-sdk/latest/developer-guide/images/icon-no.png) | 

커밋 정책 설정은 AWS Encryption SDK 버전 1.7.*x*에 도입되었습니다. 지원되는 모든 [프로그래밍 언어](programming-languages.md)에서 유효합니다.
+ `ForbidEncryptAllowDecrypt`는 키 커밋 유무에 관계없이 복호화하지만, 키 커밋으로 암호화하지는 않습니다. 버전 1.7.*x*에 도입된이 값은 애플리케이션을 실행하는 모든 호스트가 키 커밋으로 암호화된 사이퍼텍스트를 발견하기 전에 키 커밋으로 복호화할 수 있도록 설계되었습니다.
+ `RequireEncryptAllowDecrypt`는 항상 키 커밋으로 암호화합니다. 키 커밋 유무에 관계없이 복호화할 수 있습니다. 이 값은 버전 2.0.*x*에 도입되었으며, 이를 사용하면 키 커밋으로 암호화를 시작하지만 키 커밋 없이 레거시 사이퍼텍스트를 복호화할 수 있습니다.
+ `RequireEncryptRequireDecrypt`는 키 커밋을 통해서만 암호화 및 복호화합니다. 이 값은 버전 2.0.*x*의 기본값입니다. 모든 사이퍼텍스트가 키 커밋으로 암호화되는 것이 확실한 경우에 이 값을 사용합니다.

커밋 정책 설정에 따라 사용할 수 있는 알고리즘 제품군이 결정됩니다. 버전 1.7.*x*부터는 서명 유무에 관계없이 키 커밋을 위한 [알고리즘 제품군](supported-algorithms.md)을 AWS Encryption SDK 지원합니다. 커밋 정책과 충돌하는 알고리즘 제품군을 지정하는 경우 AWS Encryption SDK 에서 오류를 반환합니다.

커밋 정책을 설정하는 데 도움이 필요하면 [커밋 정책 설정](migrate-commitment-policy.md) 섹션을 참조하세요.

## 디지털 서명
<a name="digital-sigs"></a>

는 인증된 AWS Encryption SDK 암호화 알고리즘인 AES-GCM을 사용하여 데이터를 암호화하고 복호화 프로세스는 디지털 서명을 사용하지 않고 암호화된 메시지의 무결성과 신뢰성을 확인합니다. 그러나 AES-GCM은 대칭 키를 사용하기 때문에 사이퍼텍스트를 복호화하는 데 사용되는 데이터 키를 복호화할 수 있는 사용자라면 누구나 암호화된 새 사이퍼텍스트를 수동으로 생성할 수 있어 잠재적인 보안 문제가 발생할 수 있습니다. 예를 들어를 래핑 키 AWS KMS key 로 사용하는 경우 `kms:Decrypt` 권한이 있는 사용자는를 호출하지 않고 암호화된 사이퍼텍스트를 생성할 수 있습니다`kms:Encrypt`.

이 문제를 방지하기 위해는 암호화된 메시지 끝에 타원 곡선 디지털 서명 알고리즘(ECDSA) 서명을 추가하는 것을 AWS Encryption SDK 지원합니다. 서명 알고리즘 제품군을 사용하면는 암호화된 각 메시지에 대해 임시 프라이빗 키와 퍼블릭 키 페어를 AWS Encryption SDK 생성합니다. 는 데이터 키의 암호화 컨텍스트에 퍼블릭 키를 AWS Encryption SDK 저장하고 프라이빗 키를 삭제합니다. 이렇게 하면 아무도 퍼블릭 키로 확인하는 다른 서명을 생성할 수 없습니다. 이 알고리즘은 퍼블릭 키를 메시지 헤더의 추가 인증 데이터로 암호화된 데이터 키에 바인딩하여 메시지를 복호화할 수 있는 사용자가 퍼블릭 키를 변경하거나 서명 확인에 영향을 미치지 않도록 합니다.

서명 확인은 복호화 시 상당한 성능 비용을 추가시킵니다. 데이터를 암호화하는 사용자와 데이터를 복호화하는 사용자의 신뢰도가 같으면 서명이 포함되지 않은 알고리즘 제품군을 사용하는 것이 좋습니다.

**참고**  
래핑 암호화 구성 요소에 대한 키링 또는 액세스가 암호화 도구와 암호 해독기 간에 구분되지 않는 경우 디지털 서명은 암호화 값을 제공하지 않습니다.

비대칭 RSA [AWS KMS 키링](use-kms-keyring.md)을 포함한 AWS KMS 키링은 AWS KMS 키 정책 및 IAM 정책에 따라 암호화 도구와 복호화기 간에 구분할 수 있습니다.

암호화 특성으로 인해 다음 키링은 암호화 도구와 복호화자 간에 구분할 수 없습니다.
+ AWS KMS 계층적 키링
+ AWS KMS ECDH 키링
+ Raw AES 키링
+ Raw RSA 키링
+ 원시 ECDH 키링

# AWS Encryption SDK 작동 방식
<a name="how-it-works"></a>

이 섹션의 워크플로에서는 AWS Encryption SDK 가 데이터를 암호화하고 [암호화된 메시지를](concepts.md#message) 해독하는 방법을 설명합니다. 이 워크플로는 기본 기능을 사용하는 기본 프로세스를 설명합니다. 사용자 지정 구성 요소 정의 및 사용에 대한 자세한 내용은 지원되는 각 [언어 구현](programming-languages.md)의 GitHub 리포지토리를 참조하세요.

는 봉투 암호화를 AWS Encryption SDK 사용하여 데이터를 보호합니다. 각 메시지는 고유한 데이터 키로 암호화됩니다. 그러면 지정한 래핑 키를 사용해 데이터 키가 암호화됩니다. 암호화된 메시지를 해독하기 위해 AWS Encryption SDK 는 지정한 래핑 키를 사용하여 하나 이상의 암호화된 데이터 키를 해독합니다. 그런 다음 사이퍼텍스트를 복호화하여 일반 텍스트 메시지를 반환할 수 있습니다.

 AWS Encryption SDK에서 사용하는 용어에 대해 도움이 필요하신가요? [의 개념 AWS Encryption SDK](concepts.md)을(를) 참조하세요.

## 가 데이터를 AWS Encryption SDK 암호화하는 방법
<a name="encrypt-workflow"></a>

는 문자열, 바이트 배열 및 바이트 스트림을 암호화하는 메서드를 AWS Encryption SDK 제공합니다. 코드 예제는 각 [프로그래밍 언어](programming-languages.md) 섹션의 예제 항목을 참조하세요.

1. 데이터를 보호하는 래핑 키를 지정하는 [키링](choose-keyring.md)(또는 [마스터 키 공급자](concepts.md#master-key-provider))을 생성합니다.

1. 키링 및 일반 텍스트 데이터를 암호화 메서드에 전달합니다. 비밀이 아닌 선택적 [암호화 컨텍스트](concepts.md#encryption-context)를 전달하는 것이 좋습니다.

1. 암호화 메서드는 키링에 암호화 자료를 요청합니다. 키링은 메시지에 대해 일반 텍스트 데이터 키 하나와 지정된 각 래핑 키로 암호화된 해당 데이터 키의 사본 하나를 반환합니다.

1. 암호화 메서드는 일반 텍스트 데이터 키를 사용하여 데이터를 암호화한 후 일반 텍스트 데이터 키를 삭제합니다. 암호화 컨텍스트를 제공하는 경우( AWS Encryption SDK [모범 사례](best-practices.md)) 암호화 메서드는 암호화 컨텍스트를 암호화된 데이터에 암호적으로 바인딩합니다.

1. 암호화 메서드는 암호화된 데이터, 암호화된 데이터 키 및 암호화 컨텍스트를 포함한 기타 메타데이터(사용한 경우)가 포함된 [암호화된 메시지](concepts.md#message)를 반환합니다.

## 가 암호화된 메시지를 AWS Encryption SDK 복호화하는 방법
<a name="decrypt-workflow"></a>

는 [암호화된 메시지를](concepts.md#message) 복호화하고 일반 텍스트를 반환하는 메서드를 AWS Encryption SDK 제공합니다. 코드 예제는 각 [프로그래밍 언어](programming-languages.md) 섹션의 예제 항목을 참조하세요.

암호화된 메시지를 복호화하는 [키링](choose-keyring.md)(또는 [마스터 키 공급자](concepts.md#master-key-provider))은 메시지를 암호화하는 데 사용된 것과 호환되어야 합니다. 해당 래핑 키 중 하나가 암호화된 메시지의 암호화된 데이터 키를 복호화할 수 있어야 합니다. 키링 및 마스터 키 공급자와의 호환성에 대한 자세한 내용은 [키링 호환성](choose-keyring.md#keyring-compatibility) 섹션을 참조하세요.

1. 데이터를 복호화할 수 있는 래핑 키를 사용하여 키링 또는 마스터 키 공급자를 생성합니다. 암호화 메서드에 제공한 것과 동일한 키링을 사용하거나 다른 키를 사용할 수 있습니다.

1. [암호화된 메시지](concepts.md#message)와 키링을 복호화 메서드에 전달합니다.

1. 복호화 메서드는 키링 또는 마스터 키 공급자에게 암호화된 메시지의 암호화된 데이터 키 중 하나를 복호화하도록 요청합니다. 암호화된 데이터 키를 포함하여 암호화된 메시지의 정보를 전달합니다.

1. 키링은 해당 래핑 키를 사용하여 암호화된 데이터 키 중 하나를 복호화합니다. 성공하면 응답에 일반 텍스트 데이터 키가 포함됩니다. 키링 또는 마스터 키 공급자가 지정한 래핑 키가 암호화된 데이터 키를 복호화할 수 없는 경우 복호화 호출이 실패합니다.

1. 복호화 메서드는 일반 텍스트 데이터 키를 사용하여 데이터를 복호화하고 일반 텍스트 데이터 키를 삭제하며 일반 텍스트 데이터를 반환합니다.

# 에서 지원되는 알고리즘 제품군 AWS Encryption SDK
<a name="supported-algorithms"></a>

*알고리즘 제품군*은 암호화 알고리즘 및 관련 값의 모음입니다. 암호화 시스템은 알고리즘 구현을 사용하여 사이퍼텍스트를 생성합니다.

 AWS Encryption SDK 알고리즘 제품군은 AES-GCM이라고 하는 Galois/Counter Mode(GCM)의 고급 암호화 표준(AES) 알고리즘을 사용하여 원시 데이터를 암호화합니다. 는 256비트, 192비트 및 128비트 암호화 키를 AWS Encryption SDK 지원합니다. 초기화 벡터(IV)의 길이는 항상 12바이트입니다. 인증 태그의 길이는 항상 16바이트입니다.

기본적으로는 HMAC 기반 extract-and-expand 키 유도 함수([HKDF](https://en.wikipedia.org/wiki/HKDF)), 서명 및 256비트 암호화 키가 있는 AES-GCM이 있는 알고리즘 제품군을 AWS Encryption SDK 사용합니다. [커밋 정책에](concepts.md#commitment-policy) [키 커밋](concepts.md#key-commitment)이 필요한 경우는 키 커밋도 지원하는 알고리즘 제품군을 AWS Encryption SDK 선택합니다. 그렇지 않으면 키 파생 및 서명이 있지만 키 커밋이 아닌 알고리즘 제품군을 선택합니다.

## 권장: AES-GCM(키 유도. 서명, 키 커밋 포함)
<a name="recommended-algorithms"></a>

는 HMAC 기반 extract-and-expand 키 유도 함수(HKDF)에 256비트 데이터 암호화 키를 제공하여 AES-GCM 암호화 키를 도출하는 알고리즘 제품군을 AWS Encryption SDK 권장합니다. 는 타원 곡선 디지털 서명 알고리즘(ECDSA) 서명을 AWS Encryption SDK 추가합니다. [키 커밋](concepts.md#key-commitment)을 지원하기 위해 이 알고리즘 제품군은 암호화된 메시지의 메타데이터에 저장되는 *키 커밋 문자열*(비밀이 아닌 데이터 키 식별자)도 유도합니다. 이 키 커밋 문자열도 데이터 암호화 키 유도와 유사한 절차를 사용하여 HKDF를 통해 유도됩니다.


**AWS Encryption SDK 알고리즘 제품군**  

| 암호화 알고리즘 | 데이터 암호화 키 길이(비트) | 키 유도 알고리즘 | 서명 알고리즘 | 키 커밋 | 
| --- | --- | --- | --- | --- | 
| AES-GCM | 256 | HKDF(SHA-384 사용) | ECDSA(P-384 및 SHA-384 사용) | HKDF(SHA-512 사용) | 

HKDF를 사용하면 실수로 데이터 암호화 키를 재사용하는 것을 방지하고 데이터 키를 과도하게 사용할 위험을 줄일 수 있습니다.

서명을 위해 이 알고리즘 제품군은 암호화 해시 함수 알고리즘(SHA-384)과 함께 ECDSA를 사용합니다. ECDSA는 기본 마스터 키에 대한 정책에 명시되지 않았더라도 기본적으로 사용됩니다. [메시지 서명](concepts.md#digital-sigs)은 메시지 발신자가 메시지를 암호화할 권한이 있는지 확인하고 부인 방지 기능을 제공합니다. 특히 마스터 키에 대한 권한 부여 정책에서 한 사용자 세트에 대해 데이터 암호화를 허용하고 다른 사용자 세트에 데이터 복호화를 허용하는 경우에 유용합니다.

키 커밋이 포함된 알고리즘 제품군은 각 사이퍼텍스트가 하나의 일반 텍스트로만 복호화되도록 합니다. 이를 위해 암호화 알고리즘에 대한 입력으로 사용된 데이터 키의 자격 증명을 검증합니다. 암호화할 때 이러한 알고리즘 제품군은 키 커밋 문자열을 유도합니다. 복호화하기 전에 데이터 키가 키 커밋 문자열과 일치하는지 검증합니다. 그러지 않으면 복호화 호출이 실패합니다.

## 기타 지원 알고리즘 제품군
<a name="other-algorithms"></a>

는 이전 버전과의 호환성을 위해 다음과 같은 대체 알고리즘 제품군을 AWS Encryption SDK 지원합니다. 일반적으로 이러한 알고리즘 제품군은 사용하지 않는 것이 좋습니다. 하지만 서명이 성능을 크게 저해할 수 있다는 점을 잘 알고 있기 때문에 이러한 경우를 위해 키 유도가 포함된 키 커밋 제품군이 제공됩니다. 성능 절충을 더 많이 해야 하는 애플리케이션을 위해 서명, 키 커밋 및 키 유도가 없는 제품군이 계속 제공됩니다.

**AES-GCM(키 커밋 없음)**  
키 커밋이 없는 알고리즘 제품군은 복호화하기 전에 데이터 키를 검증하지 않습니다. 따라서 이러한 알고리즘 제품군은 단일 사이퍼텍스트를 다른 일반 텍스트 메시지로 복호화할 수 있습니다. 그러나 키 커밋이 포함된 알고리즘 제품군은 [약간 더 큰(\$130바이트) 암호화된 메시지](message-format.md)를 생성하여 처리 시간이 더 오래 걸리기 때문에 모든 애플리케이션에 가장 적합한 선택은 아닙니다.  
는 키 파생, 키 커밋, 서명이 있는 알고리즘 제품군과 키 파생 및 키 커밋이 있지만 서명은 없는 알고리즘 제품군을 AWS Encryption SDK 지원합니다. 키 커밋이 없는 알고리즘 제품군은 사용하지 않는 것이 좋습니다. 꼭 필요한 경우 키 유도 및 키 커밋은 포함되지만 서명은 없는 알고리즘 제품군을 사용하는 것이 좋습니다. 그러나 애플리케이션 성능 프로파일이 알고리즘 제품군 사용을 지원하는 경우 키 커밋, 키 유도 및 서명이 포함된 알고리즘 제품군을 사용하는 것이 모범 사례입니다.

**서명 없는 AES-GCM**  
서명이 없는 알고리즘 모음에는 신뢰성 및 부인 방지를 제공하는 ECDSA 서명이 없습니다. 해당 제품군은 데이터를 암호화하는 사용자와, 데이터를 복호화하는 사용자를 동등하게 신뢰할 수 있는 경우에만 사용하세요.  
서명 없는 알고리즘 제품군을 사용하는 경우 키 유도 및 키 커밋이 포함된 알고리즘 제품군을 사용하는 것이 좋습니다.

**AES-GCM(키 유도 없음)**  
키 유도가 없는 알고리즘 제품군은 키 유도 함수를 사용하여 고유 키를 유도하는 대신 데이터 암호화 키를 AES-GCM 암호화 키로 사용합니다. 이 제품군을 사용하여 사이퍼텍스트를 생성하는 것은 권장하지 않지만는 호환성을 위해 이를 AWS Encryption SDK 지원합니다.

이러한 제품군이 라이브러리에서 어떻게 표시되고 사용되는지에 대한 자세한 내용은 [AWS Encryption SDK 알고리즘 참조](algorithms-reference.md) 섹션을 참조하세요.