

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

# .NET 예제
<a name="ddb-net-examples"></a>

다음 예제에서는 DynamoDB용 .NET 클라이언트 측 암호화 라이브러리를 사용하여 애플리케이션의 테이블 항목을 보호하는 방법을 보여줍니다. 더 많은 예제를 찾으려면(자신에게 기여하려면) GitHub의 aws-database-encryption-sdk-dynamodb 리포지토리에서 [.NET 예제](https://github.com/aws/aws-database-encryption-sdk-dynamodb//tree/main/Examples/runtimes/net/src)를 참조하세요.

다음 예제에서는 채워지지 않은 새 Amazon DynamoDB 테이블에서 DynamoDB에 대한 .NET 클라이언트 측 암호화 라이브러리를 구성하는 방법을 보여줍니다. 클라이언트측 암호화를 위해 기존 Amazon DynamoDB 테이블을 구성하려면 [기존 테이블에 버전 3.x 추가](ddb-net-config-existing-table.md) 섹션을 참조하세요.

**Topics**
+ [DynamoDB API용 하위 수준 AWS 데이터베이스 암호화 SDK 사용](#ddb-net-lowlevel-API-example)
+ [하위 수준 사용 `DynamoDbItemEncryptor`](#ddb-net-itemencryptor)

## DynamoDB API용 하위 수준 AWS 데이터베이스 암호화 SDK 사용
<a name="ddb-net-lowlevel-API-example"></a>

다음 예제에서는 하위 수준 AWS Database Encryption SDK for DynamoDB API를 [AWS KMS 키링](use-kms-keyring.md)과 함께 사용하여 DynamoDB `PutItem` 요청으로 클라이언트 측 항목을 자동으로 암호화하고 서명하는 방법을 보여줍니다.

지원되는 모든 [키링](keyrings.md)을 사용할 수 있지만 가능하면 AWS KMS 키링 중 하나를 사용하는 것이 좋습니다.

**전체 코드 샘플**: [BasicPutGetExample.cs](https://github.com/aws/aws-database-encryption-sdk-dynamodb/tree/main/Examples/runtimes/net/src/BasicPutGetExample.cs) 참조

**1단계: AWS KMS 키링 생성**  
다음 예제에서는 `CreateAwsKmsMrkMultiKeyring`를 사용하여 대칭 암호화 KMS AWS KMS 키로 키링을 생성합니다. 이 `CreateAwsKmsMrkMultiKeyring` 방법을 사용하면 키링이 단일 리전 키와 다중 리전 키를 모두 올바르게 처리할 수 있습니다.  

```
var matProv = new MaterialProviders(new MaterialProvidersConfig());
var keyringInput = new CreateAwsKmsMrkMultiKeyringInput { Generator = kmsKeyId };
var kmsKeyring = matProv.CreateAwsKmsMrkMultiKeyring(keyringInput);
```

**2단계: 속성 작업 구성**  
다음 예제에서는 테이블 항목에 대한 샘플 [속성 작업을](concepts.md#crypt-actions) 나타내는 `attributeActionsOnEncrypt` 사전을 정의합니다.  
다음 예제에서는 속성을 로 정의하지 않습니다`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`. `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` 속성을 지정하는 경우 파티션 및 정렬 속성도 여야 합니다`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`.

```
var attributeActionsOnEncrypt = new Dictionary<string, CryptoAction>
{
    ["partition_key"] = CryptoAction.SIGN_ONLY, // The partition attribute must be SIGN_ONLY
    ["sort_key"] = CryptoAction.SIGN_ONLY, // The sort attribute must be SIGN_ONLY
    ["attribute1"] = CryptoAction.ENCRYPT_AND_SIGN,
    ["attribute2"] = CryptoAction.SIGN_ONLY,
    [":attribute3"] = CryptoAction.DO_NOTHING
};
```

**3단계: 시그니처에서 제외할 속성을 정의합니다.**  
다음 예제에서는 모든 `DO_NOTHING` 속성이 고유한 접두사 "`:`“를 공유한다고 가정하고 이 접두사를 사용하여 허용된 서명되지 않은 속성을 정의합니다. 클라이언트는 접두사가 "`:`"인 모든 속성 이름이 서명에서 제외된다고 가정합니다. 자세한 내용은 [Allowed unsigned attributes](ddb-net-using.md#net-allowed-unauth) 단원을 참조하십시오.  

```
const String unsignAttrPrefix = ":";
```

**4단계: DynamoDB 테이블 암호화 구성 정의**  
다음 예제는 이 DynamoDB 테이블의 암호화 구성을 나타내는 `tableConfigs` 맵을 정의합니다.  
이 예제에서는 DynamoDB 테이블 이름을 [논리적 테이블 이름](ddb-net-using.md#net-logical-table-name)으로 지정합니다. 암호화 구성을 처음 정의할 때 DynamoDB 테이블 이름을 논리적 테이블 이름으로 지정하는 것이 좋습니다. 자세한 내용은 [AWS Database Encryption SDK for DynamoDB의 암호화 구성](ddb-net-using.md#ddb-net-config-encrypt) 단원을 참조하십시오.  
[검색 가능한 암호화](searchable-encryption.md) 또는 [서명된 비컨](configure.md#signed-beacons)을 사용하려면 암호화 구성에도 [`SearchConfig`](ddb-java-using.md#ddb-search-config)을 포함해야 합니다.

```
Dictionary<String, DynamoDbTableEncryptionConfig> tableConfigs =
    new Dictionary<String, DynamoDbTableEncryptionConfig>();
DynamoDbTableEncryptionConfig config = new DynamoDbTableEncryptionConfig
{
    LogicalTableName = ddbTableName,
    PartitionKeyName = "partition_key",
    SortKeyName = "sort_key",
    AttributeActionsOnEncrypt = attributeActionsOnEncrypt,
    Keyring = kmsKeyring,
    AllowedUnsignedAttributePrefix = unsignAttrPrefix
};
tableConfigs.Add(ddbTableName, config);
```

**5단계: 새 AWS SDK DynamoDB 클라이언트 생성**  
다음 예제에서는 **4단계**`TableEncryptionConfigs`의를 사용하여 새 AWS SDK DynamoDB 클라이언트를 생성합니다.  

```
var ddb = new Client.DynamoDbClient(
    new DynamoDbTablesEncryptionConfig { TableEncryptionConfigs = tableConfigs });
```

**6단계: DynamoDB 테이블 항목 암호화 및 서명**  
다음 예제에서는 샘플 테이블 항목을 나타내는 `item` 사전을 정의하고 DynamoDB 테이블에 해당 항목을 넣습니다. 항목은 DynamoDB로 전송되기 전에 클라이언트측에서 암호화되고 서명됩니다.  

```
var item = new Dictionary<String, AttributeValue>
{
    ["partition_key"] = new AttributeValue("BasicPutGetExample"),
    ["sort_key"] = new AttributeValue { N = "0" },
    ["attribute1"] = new AttributeValue("encrypt and sign me!"),
    ["attribute2"] = new AttributeValue("sign me!"),
    [":attribute3"] = new AttributeValue("ignore me!")
};

PutItemRequest putRequest = new PutItemRequest
{
    TableName = ddbTableName,
    Item = item
};

PutItemResponse putResponse = await ddb.PutItemAsync(putRequest);
```

## 하위 수준 사용 `DynamoDbItemEncryptor`
<a name="ddb-net-itemencryptor"></a>

다음 예제는 [AWS KMS 키링](use-kms-keyring.md)이 있는 하위 수준 `DynamoDbItemEncryptor`을 사용하여 테이블 항목을 직접 암호화하고 서명하는 방법을 보여줍니다. `DynamoDbItemEncryptor`는 DynamoDB 테이블에 항목을 배치하지 않습니다.

DynamoDB Enhanced Client에서 지원되는 모든 [키링](keyrings.md)을 사용할 수 있지만 가능하면 AWS KMS 키링 중 하나를 사용하는 것이 좋습니다.

**참고**  
하위 수준 `DynamoDbItemEncryptor`은 [검색 가능한 암호화](searchable-encryption.md)를 지원하지 않습니다. 하위 수준 AWS Database Encryption SDK for DynamoDB API를 사용하여 검색 가능한 암호화를 사용합니다.

**전체 코드 샘플**: [ItemEncryptDecryptExample.cs](https://github.com/aws/aws-database-encryption-sdk-dynamodb/tree/main/Examples/runtimes/net/src/itemencryptor/ItemEncryptDecryptExample.cs) 참조

**1단계: AWS KMS 키링 생성**  
다음 예제에서는 `CreateAwsKmsMrkMultiKeyring`를 사용하여 대칭 암호화 KMS AWS KMS 키로 키링을 생성합니다. 이 `CreateAwsKmsMrkMultiKeyring` 방법을 사용하면 키링이 단일 리전 키와 다중 리전 키를 모두 올바르게 처리할 수 있습니다.  

```
var matProv = new MaterialProviders(new MaterialProvidersConfig());
var keyringInput = new CreateAwsKmsMrkMultiKeyringInput { Generator = kmsKeyId };
var kmsKeyring = matProv.CreateAwsKmsMrkMultiKeyring(keyringInput);
```

**2단계: 속성 작업 구성**  
다음 예제에서는 테이블 항목에 대한 샘플 [속성 작업을](concepts.md#crypt-actions) 나타내는 `attributeActionsOnEncrypt` 사전을 정의합니다.  
다음 예제에서는 속성을 로 정의하지 않습니다`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`. `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` 속성을 지정하는 경우 파티션 및 정렬 속성도 여야 합니다`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`.

```
var attributeActionsOnEncrypt = new Dictionary<String, CryptoAction>
{
    ["partition_key"] = CryptoAction.SIGN_ONLY, // The partition attribute must be SIGN_ONLY
    ["sort_key"] = CryptoAction.SIGN_ONLY, // The sort attribute must be SIGN_ONLY
    ["attribute1"] = CryptoAction.ENCRYPT_AND_SIGN,
    ["attribute2"] = CryptoAction.SIGN_ONLY,
    [":attribute3"] = CryptoAction.DO_NOTHING
};
```

**3단계: 시그니처에서 제외할 속성을 정의합니다.**  
다음 예제에서는 모든 `DO_NOTHING` 속성이 고유한 접두사 "`:`“를 공유한다고 가정하고 이 접두사를 사용하여 허용된 서명되지 않은 속성을 정의합니다. 클라이언트는 접두사가 "`:`"인 모든 속성 이름이 서명에서 제외된다고 가정합니다. 자세한 내용은 [Allowed unsigned attributes](ddb-net-using.md#net-allowed-unauth) 단원을 참조하십시오.  

```
String unsignAttrPrefix = ":";
```

**4단계: `DynamoDbItemEncryptor` 구성 정의**  
다음 예제에서는 `DynamoDbItemEncryptor`의 구성을 정의합니다.  
이 예제에서는 DynamoDB 테이블 이름을 [논리적 테이블 이름](ddb-net-using.md#net-logical-table-name)으로 지정합니다. 암호화 구성을 처음 정의할 때 DynamoDB 테이블 이름을 논리적 테이블 이름으로 지정하는 것이 좋습니다. 자세한 내용은 [AWS Database Encryption SDK for DynamoDB의 암호화 구성](ddb-net-using.md#ddb-net-config-encrypt) 단원을 참조하십시오.  

```
var config = new DynamoDbItemEncryptorConfig
{
    LogicalTableName = ddbTableName,
    PartitionKeyName = "partition_key",
    SortKeyName = "sort_key",
    AttributeActionsOnEncrypt = attributeActionsOnEncrypt,
    Keyring = kmsKeyring,
    AllowedUnsignedAttributePrefix = unsignAttrPrefix
};
```

**5단계: `DynamoDbItemEncryptor` 생성**  
다음 예제에서는 **4단계**의 `config`를 사용하여 새 `DynamoDbItemEncryptor`을 만듭니다.  

```
var itemEncryptor = new DynamoDbItemEncryptor(config);
```

**6단계: 테이블 항목을 직접 암호화하고 서명합니다.**  
다음 예제에서는 `DynamoDbItemEncryptor`를 사용하여 항목을 직접 암호화하고 서명합니다. `DynamoDbItemEncryptor`는 DynamoDB 테이블에 항목을 배치하지 않습니다.  

```
var originalItem = new Dictionary<String, AttributeValue>
{
    ["partition_key"] = new AttributeValue("ItemEncryptDecryptExample"),
    ["sort_key"] = new AttributeValue { N = "0" },
    ["attribute1"] = new AttributeValue("encrypt and sign me!"),
    ["attribute2"] = new AttributeValue("sign me!"),
    [":attribute3"] = new AttributeValue("ignore me!")
};

var encryptedItem = itemEncryptor.EncryptItem(
    new EncryptItemInput { PlaintextItem = originalItem }
).EncryptedItem;
```