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

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

AWS Encryption SDK 適用於 。NET 範例

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

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

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

加密 中 AWS Encryption SDK 適用於 的資料。NET

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

步驟 1:現化 AWS Encryption SDK 和材料提供者程式庫。

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

的 3.x 和 4.x 版的 AWS Encryption SDK 與材料提供者程式庫的實例化方式不同 AWS Encryption SDK NET。3.x 和 4.x 版的 的所有下列步驟都相同 AWS Encryption SDK NET。

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:建立金鑰環的輸入物件。

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

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

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

在使用 AWS Encryption SDK for . 加密的 AWS KMS 鍵環中NET,您可以使用KMS金鑰 ID、金鑰 、別名名稱或別名 來識別金鑰ARN。 ARN在用於解密的 AWS KMS 鍵環中,您必須使用 金鑰ARN來識別每個KMS金鑰。如果您打算重複使用加密金鑰環進行解密,請為所有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:建立 鍵環。

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

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

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

注意

使用適用於 的 4.x AWS Encryption SDK 版NET,您可以在具有所需加密內容 的所有加密請求中要求加密內容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 ,使用您定義的鍵環加密純文字。

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

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

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

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

var encryptedMessage = encryptOutput.Ciphertext;

在適用於 AWS Encryption SDK 的 中以嚴格模式解密。NET

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

此範例顯示使用 AWS Encryption SDK 適用於 的 ,在嚴格模式下解密的基本模式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:建立索引鍵的輸入物件。

若要指定鍵控方法的參數,請建立輸入物件。 AWS Encryption SDK 適用於 的 中的每個鍵環方法。NET 具有對應的輸入物件。由於此範例使用 CreateAwsKmsKeyring()方法建立鍵環,因此會實例化輸入的CreateAwsKmsKeyringInput類別。

在解密金鑰集中,您必須使用金鑰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:建立 鍵環。

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

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

若要建立Decrypt()方法的輸入物件,請初始化 DecryptInput類別。

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

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

確認用於加密的加密內容包含在用來解密加密文字的加密內容中。如果您使用具有簽署的演算法套件,例如預設演算法套件, 新增 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 適用於 的 中的探索鍵環進行解密。NET

除了指定解密的KMS金鑰之外,您還可以提供 AWS KMS 探索金鑰環 ,這是未指定任何KMS金鑰的金鑰環。探索鍵控可讓 使用任何加密的KMS金鑰 AWS Encryption SDK 來解密資料,前提是呼叫者對金鑰具有解密許可。針對最佳實務,新增探索篩選條件,以限制可用於指定分割區 AWS 帳戶 的KMS金鑰。

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

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

步驟 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:建立鍵環的輸入物件。

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

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

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

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

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

對於 AWS Encryption SDK 適用於 的 4.x 版NET,您可以使用選用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 適用於 的 3.xDecrypt()方法。NET 不會在 上使用加密內容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"); }