AWS Encryption SDK 適用於 .NET 範例 - AWS Encryption SDK

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

AWS Encryption SDK 適用於 .NET 範例

下列範例顯示使用 AWS Encryption SDK for .NET 進行程式設計時所使用的基本編碼模式。具體而言,您會執行個體化 AWS Encryption SDK 和 材料提供者程式庫。然後,在呼叫每個方法之前,您可以執行個體化物件,定義方法的輸入。這與您在 中使用的編碼模式非常相似 AWS SDK for .NET。

如需示範如何在 中設定選項的範例 AWS Encryption SDK,例如指定替代演算法套件、限制加密的資料金鑰,以及使用 AWS KMS 多區域金鑰,請參閱 設定 AWS Encryption SDK

如需使用 AWS Encryption SDK 適用於 .NET 的 進行程式設計的更多範例,請參閱 GitHub 上aws-encryption-sdk儲存庫aws-encryption-sdk-net目錄中的範例

在 AWS Encryption SDK for .NET 中加密資料

此範例顯示加密資料的基本模式。它會使用資料金鑰來加密小型檔案,這些金鑰受到一個 AWS KMS 包裝金鑰的保護。

步驟 1:執行個體化 AWS Encryption SDK 和 材料提供者程式庫。

從執行個體化 AWS Encryption SDK 和材料提供者程式庫開始。您將使用 中的方法來 AWS Encryption SDK 加密和解密資料。您將使用物料提供者程式庫中的方法,來建立 keyring,以指定哪些金鑰可保護您的資料。

您執行個體化 AWS Encryption SDK 和材料提供者程式庫的方式,在 AWS Encryption SDK .NET 的 3.x 和 4.x 版之間有所不同。適用於 .NET 的 3.x 版和 4 AWS Encryption SDK .x 版的所有下列步驟都相同。

Version 3.x
// Instantiate the AWS Encryption SDK and material providers var encryptionSdk = AwsEncryptionSdkFactory.CreateDefaultAwsEncryptionSdk(); var materialProviders = AwsCryptographicMaterialProvidersFactory.CreateDefaultAwsCryptographicMaterialProviders();
Version 4.x
// Instantiate the AWS Encryption SDK and material providers var esdk = new ESDK(new AwsEncryptionSdkConfig()); var mpl = new MaterialProviders(new MaterialProvidersConfig());
步驟 2:建立 keyring 的輸入物件。

每個建立 keyring 的方法都有對應的輸入物件類別。例如,若要建立 CreateAwsKmsKeyring() 方法的輸入物件,請建立 CreateAwsKmsKeyringInput類別的執行個體。

即使此 keyring 的輸入未指定產生器金鑰KmsKeyId 參數指定的單一 KMS 金鑰仍為產生器金鑰。它會產生並加密加密資料的資料金鑰。

此輸入物件需要 KMS 金鑰 AWS 區域 的 AWS KMS 用戶端。若要建立 AWS KMS 用戶端,請在 中執行個體化 AmazonKeyManagementServiceClient類別 AWS SDK for .NET。呼叫無參數的AmazonKeyManagementServiceClient()建構函式會建立具有預設值的用戶端。

在用於使用 AWS Encryption SDK for .NET 加密的 AWS KMS keyring 中,您可以使用金鑰 ID、金鑰 ARN、別名名稱或別名 ARN 來識別 KMS 金鑰。在用於解密的 AWS KMS keyring 中,您必須使用金鑰 ARN 來識別每個 KMS 金鑰。如果您打算重複使用加密 keyring 進行解密,請為所有 KMS 金鑰使用金鑰 ARN 識別符。

string keyArn = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"; // Instantiate the keyring input object var kmsKeyringInput = new CreateAwsKmsKeyringInput { KmsClient = new AmazonKeyManagementServiceClient(), KmsKeyId = keyArn };
步驟 3:建立 keyring。

若要建立 keyring,請使用 keyring 輸入物件呼叫 keyring 方法。此範例使用 CreateAwsKmsKeyring()方法,只需要一個 KMS 金鑰。

var keyring = materialProviders.CreateAwsKmsKeyring(kmsKeyringInput);
步驟 4:定義加密內容。

加密內容是選用的,但強烈建議在 中進行密碼編譯操作 AWS Encryption SDK。您可以定義一或多個非秘密金鑰值對。

注意

使用適用於 .NET 的 4 AWS Encryption SDK .x 版,您可以在具有所需加密內容 CMM 的所有加密請求中要求加密內容

// Define the encryption context var encryptionContext = new Dictionary<string, string>() { {"purpose", "test"} };
步驟 5:建立用於加密的輸入物件。

呼叫 Encrypt()方法之前,請建立 EncryptInput類別的執行個體。

string plaintext = File.ReadAllText("C:\\Documents\\CryptoTest\\TestFile.txt"); // Define the encrypt input var encryptInput = new EncryptInput { Plaintext = plaintext, Keyring = keyring, EncryptionContext = encryptionContext };
步驟 6:加密純文字。

使用 的 Encrypt()方法 AWS Encryption SDK ,使用您定義的 keyring 加密純文字。

Encrypt() 方法傳回EncryptOutput的 具有取得加密訊息 (Ciphertext)、加密內容和演算法套件的方法。

var encryptOutput = encryptionSdk.Encrypt(encryptInput);
步驟 7:取得加密的訊息。

AWS Encryption SDK 適用於 .NET 的 中Decrypt()的方法採用EncryptOutput執行個體Ciphertext的成員。

EncryptOutput 物件Ciphertext的成員是加密訊息,這是一個可攜式物件,其中包含加密的資料、加密的資料金鑰和中繼資料,包括加密內容。您可以安全地將加密的訊息存放一段時間,或將其提交至 Decrypt()方法以復原純文字。

var encryptedMessage = encryptOutput.Ciphertext;

在 for .NET AWS Encryption SDK 中以嚴格模式解密

最佳實務建議您指定用來解密資料的金鑰,這是稱為嚴格模式的選項。只會 AWS Encryption SDK 使用您在 keyring 中指定的 KMS 金鑰來解密加密文字。解密 keyring 中的金鑰必須包含至少一個加密資料的金鑰。

此範例顯示使用 AWS Encryption SDK for .NET 在嚴格模式下解密的基本模式。

步驟 1:執行個體化 AWS Encryption SDK 和 材料提供者程式庫。
// Instantiate the AWS Encryption SDK and material providers var esdk = new ESDK(new AwsEncryptionSdkConfig()); var mpl = new MaterialProviders(new MaterialProvidersConfig());
步驟 2:建立 keyring 的輸入物件。

若要指定 keyring 方法的參數,請建立輸入物件。 AWS Encryption SDK 適用於 .NET 的 中的每個 keyring 方法都有對應的輸入物件。由於此範例使用 CreateAwsKmsKeyring()方法來建立 keyring,因此會執行個體化輸入CreateAwsKmsKeyringInput類別。

在解密 keyring 中,您必須使用金鑰 ARN 來識別 KMS 金鑰。

string keyArn = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"; // Instantiate the keyring input object var kmsKeyringInput = new CreateAwsKmsKeyringInput { KmsClient = new AmazonKeyManagementServiceClient(), KmsKeyId = keyArn };
步驟 3:建立 keyring。

若要建立解密 keyring,此範例會使用 CreateAwsKmsKeyring()方法和 keyring 輸入物件。

var keyring = materialProviders.CreateAwsKmsKeyring(kmsKeyringInput);
步驟 4:建立用於解密的輸入物件。

若要建立 Decrypt() 方法的輸入物件,請執行個體化 DecryptInput類別。

DecryptInput() 建構函數的 Ciphertext 參數會取得Encrypt()方法傳回的EncryptOutput物件Ciphertext成員。Ciphertext 屬性代表加密的訊息,其中包含 解密訊息所需的加密資料、加密資料金鑰和中繼資料 AWS Encryption SDK 。

使用適用於 AWS Encryption SDK .NET 的 4.x 版,您可以使用選用EncryptionContext參數在 Decrypt()方法中指定加密內容。

使用 EncryptionContext 參數來驗證加密上使用的加密內容是否包含在用於解密加密文字的加密內容中。如果您使用演算法套件搭配簽署,例如預設演算法套件, 會將配對 AWS Encryption SDK 新增至加密內容,包括數位簽章。

var encryptedMessage = encryptOutput.Ciphertext; var decryptInput = new DecryptInput { Ciphertext = encryptedMessage, Keyring = keyring, EncryptionContext = encryptionContext // OPTIONAL };
步驟 5:解密加密文字。
var decryptOutput = encryptionSdk.Decrypt(decryptInput);
步驟 6:驗證加密內容 – 3.x

AWS Encryption SDK 適用於 .NET 的 3.xDecrypt()方法不會採用加密內容。它會從加密訊息中的中繼資料取得加密內容值。不過,在傳回或使用純文字之前,最佳實務是驗證用來解密加密文字的加密內容包含您在加密時提供的加密內容。

確認用於加密的加密內容包含在用於解密加密文字的加密內容中。如果您使用演算法套件搭配簽署,例如預設演算法套件, 會將配對 AWS Encryption SDK 新增至加密內容,包括數位簽章。

// Verify the encryption context string contextKey = "purpose"; string contextValue = "test"; if (!decryptOutput.EncryptionContext.TryGetValue(contextKey, out var decryptContextValue) || !decryptContextValue.Equals(contextValue)) { throw new Exception("Encryption context does not match expected values"); }

在 AWS Encryption SDK for .NET 中使用探索 keyring 解密

與其指定用於解密的 KMS 金鑰,您可以提供 AWS KMS 探索 keyring,而探索 keyring 是不指定任何 KMS 金鑰的 keyring。探索 keyring 可讓 使用任何 KMS 金鑰來 AWS Encryption SDK 解密資料,前提是發起人對金鑰具有解密許可。針對最佳實務,請新增探索篩選條件,以限制 KMS 金鑰,可用於特定分割區 AWS 帳戶 的金鑰。

AWS Encryption SDK for .NET 提供基本的探索 keyring,需要用戶端 AWS KMS 和探索多 keyring,需要您指定一或多個 AWS 區域。用戶端和區域都會限制可用於解密加密訊息的 KMS 金鑰。兩個 keyring 的輸入物件都採用建議的探索篩選條件。

下列範例顯示使用 AWS KMS 探索 keyring 和探索篩選條件解密資料的模式。

步驟 1:執行個體化 AWS Encryption SDK 和材料提供者程式庫。
// Instantiate the AWS Encryption SDK and material providers var esdk = new ESDK(new AwsEncryptionSdkConfig()); var mpl = new MaterialProviders(new MaterialProvidersConfig());
步驟 2:建立 keyring 的輸入物件。

若要指定 keyring 方法的參數,請建立輸入物件。 AWS Encryption SDK 適用於 .NET 的 中的每個 keyring 方法都有對應的輸入物件。由於此範例使用 CreateAwsKmsDiscoveryKeyring()方法來建立 keyring,因此會執行個體化輸入CreateAwsKmsDiscoveryKeyringInput類別。

List<string> accounts = new List<string> { "111122223333" }; var discoveryKeyringInput = new CreateAwsKmsDiscoveryKeyringInput { KmsClient = new AmazonKeyManagementServiceClient(), DiscoveryFilter = new DiscoveryFilter() { AccountIds = accounts, Partition = "aws" } };
步驟 3:建立 keyring。

若要建立解密 keyring,此範例會使用 CreateAwsKmsDiscoveryKeyring()方法和 keyring 輸入物件。

var discoveryKeyring = materialProviders.CreateAwsKmsDiscoveryKeyring(discoveryKeyringInput);
步驟 4:建立用於解密的輸入物件。

若要建立 Decrypt() 方法的輸入物件,請執行個體化 DecryptInput類別。Ciphertext 參數的值是 Encrypt()方法傳回之EncryptOutput物件Ciphertext的成員。

使用適用於 .NET 的 4 AWS Encryption SDK .x 版,您可以使用選用EncryptionContext參數在 Decrypt()方法中指定加密內容。

使用 EncryptionContext 參數來驗證加密時使用的加密內容是否包含在用於解密加密文字的加密內容中。如果您使用演算法套件搭配簽署,例如預設演算法套件, 會將配對 AWS Encryption SDK 新增至加密內容,包括數位簽章。

var ciphertext = encryptOutput.Ciphertext; var decryptInput = new DecryptInput { Ciphertext = ciphertext, Keyring = discoveryKeyring, EncryptionContext = encryptionContext // OPTIONAL }; var decryptOutput = encryptionSdk.Decrypt(decryptInput);
步驟 5:驗證加密內容 – 3.x

AWS Encryption SDK 適用於 .NET 的 3.xDecrypt()方法不會在 上套用加密內容Decrypt()。它會從加密訊息中的中繼資料取得加密內容值。不過,在傳回或使用純文字之前,最佳實務是驗證用來解密加密文字的加密內容包含您在加密時提供的加密內容。

確認用於加密的加密內容包含在用來解密加密文字的加密內容中。如果您使用演算法套件搭配簽署,例如預設演算法套件, 會將配對 AWS Encryption SDK 新增至加密內容,包括數位簽章。

// Verify the encryption context string contextKey = "purpose"; string contextValue = "test"; if (!decryptOutput.EncryptionContext.TryGetValue(contextKey, out var decryptContextValue) || !decryptContextValue.Equals(contextValue)) { throw new Exception("Encryption context does not match expected values"); }