常見問答集 - AWS Encryption SDK

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

常見問答集

AWS Encryption SDK與 AWS 開發套件有何不同?

所以此AWS開發套件提供用於與 Amazon Web Services 互動的資料庫 (AWS),包括AWS Key Management Service(AWS KMS。一些語言實現AWS Encryption SDK,例如AWS Encryption SDK.NET,始終需要AWSSDK 使用相同的編程語言。其他語言實現需要相應的AWSSDK 僅當您使用AWS KMS密鑰在密鑰環或主密鑰提供程序中。如需詳細資訊,請參程式設計語言的主題:AWS Encryption SDK程式設計語言

您可以使用AWS要與之交互的 SDKAWS KMS,包括對少量數據進行加密和解密(使用對稱加密密鑰最多 4,096 字節),以及生成用於客户端加密的數據密鑰。但是,在生成數據密鑰時,您必須管理整個加密和解密過程,包括使用AWS KMS,安全地丟棄明文數據密鑰,存儲加密的數據密鑰,然後解密數據密鑰並解密您的數據。所以此AWS Encryption SDK為您處理此過程。

所以此AWS Encryption SDK提供使用行業標準和最佳實務來加密和解密資料的程式庫。它生成數據密鑰,在您指定的包裝密鑰下對其進行加密,並返回已加密訊息,這是一個便攜式資料對象,其中包含已加密資料和解密所需的加密資料金鑰。當需要解密時,您將傳入加密消息和至少一個包裝密鑰(可選),並且AWS Encryption SDK傳回純文字資料。

您可以將AWS KMS keys作為包裝鍵在AWS Encryption SDK,但並不是必要項目。您可以使用您生成的加密密鑰以及從密鑰管理器或本地硬件安全模塊生成的加密密鑰。您可以使用AWS Encryption SDK即使您沒有AWS帳户。

的運作方式AWS Encryption SDK與 Amazon S3 加密用户端有所不同?

所以此Amazon S3 加密用户端中的AWS軟體開發套件會為您存放在 Amazon Simple Storage Service (Amazon S3) 中的資料,提供加密和解密。這些用户端與 Amazon S3 緊密結合,僅適用於存放在這裏的資料。

AWS Encryption SDK則對您存放在任何地方的資料提供加密和解密。所以此AWS Encryption SDK和 Amazon S3 加密用户端會產生不同資料格式的加密文字,因此並不相容。

AWS Encryption SDK支援哪些密碼編譯演算法?何者為預設值?

所以此AWS Encryption SDK使用 Galois/Counter Mode (GCM) 中的進階加密標準 (AES) 對稱演算法 (簡稱為 AES-GCM) 來加密資料。它允許您從多種對稱和非對稱算法中進行選擇,以加密數據加密的數據密鑰。

對於 AES-GCM,默認算法套件是 AES-GCM,具有 256 位密鑰、密鑰派生 (HKDF)、數字簽名,以及關鍵承諾。AWS Encryption SDK也支援 192 位元和 128 位元的加密金鑰和加密演算法,無需數位簽章和金鑰承諾。

在所有情況下,初始化向量 (IV) 的長度一律為 12 個位元組;身份驗證標籤的長度一律為 16 個位元組。預設情況下,軟體開發套件會使用資料金鑰做為輸入到 extract-and-expand 金鑰衍生函數 (HKDF) 來衍生 AES-GCM 加密金鑰,也可以新增 Elliptic Curve 數位簽章演算法 (ECDSA) 簽章。

如需選擇使用哪個演算法的相關資訊,請參閱支援的演算法套件

如需受支援演算法的詳細資訊,請參閱演算法參考

初始化向量 (IV) 如何產生?存放在哪裡?

所以此AWS Encryption SDK使用決定性方法來為每個框架建構不同的 IV 值。此過程可確保 IVs 永遠不會在消息中重複。(在 1.3.0 版之前的適用於 JAVA 的 AWS Encryption SDK與適用於 Python 的 AWS Encryption SDK,AWS Encryption SDK為每個框架隨機產生唯一的 IV 值。)

IV 存放在已加密訊息中,AWS Encryption SDK傳回。如需詳細資訊,請參閱 AWS Encryption SDK訊息格式參考

每個資料金鑰如何產生、加密及解密?

方法取決於您使用的金鑰環或主金鑰提供者。

所以此AWS KMS密鑰環和主密鑰提供程序AWS Encryption SDK使用AWS KMS GenerateDataKeyAPI 操作來生成每個數據密鑰並在其包裝密鑰下對其進行加密。要在其他 KMS 密鑰下加密數據密鑰的副本,它們使用AWS KMS 加密operation. 要解密數據密鑰,它們使用AWS KMS 解密operation. 如需詳細資訊,請參閱AWS KMSKeyring中的AWS Encryption SDK規格 GitHub。

其他密鑰環使用每種編程語言的最佳實踐方法生成數據密鑰、加密和解密。有關詳細信息,請參閲框架部分的AWS Encryption SDK規格 GitHub。

如何追蹤用來加密資料的資料金鑰?

AWS Encryption SDK會為您妥善處理。當您加密資料時,軟體開發套件會加密資料金鑰並將加密的金鑰與加密的資料一起存放在它傳回的已加密訊息中。當您解密資料時,AWS Encryption SDK會從加密的訊息中擷取加密的資料金鑰、將其解密,然後使用它來解密資料。

AWS Encryption SDK如何存放加密的資料金鑰與其加密的資料?

AWS Encryption SDK中的加密操作會傳回已加密訊息,這是包含已加密資料及其加密資料金鑰的單一資料結構。訊息格式包含兩個部分:標題本文。訊息標題會包含加密的資料金鑰,以及說明訊息標題組成方式的資訊。訊息內文包含加密的資料。如果算法套件包含數位簽章,則訊息格式會包含頁腳,其中包含簽章。如需詳細資訊,請參閱 AWS Encryption SDK訊息格式參考

AWS Encryption SDK的訊息格式會對我的加密資料增加多少負擔?

AWS Encryption SDK增加的負擔量取決於數個因素,包括下列幾項:

  • 純文字資料的大小

  • 所使用的支援演算法

  • 是否提供額外的驗證資料 (AAD),以及該 AAD 的長度

  • 包裝金鑰或主金鑰的數量和類型

  • 框架大小 (使用具框架資料時)

當您使用AWS Encryption SDK的默認配置(一個AWS KMS key做為包裝金鑰(或主金鑰)、沒有 AAD、無框架資料和帶簽章的加密演算法),負擔大約是 600 個位元組。一般而言,您可以合理假設 AWS Encryption SDK增加 1 KB 或更少的負擔,不包含提供的 AAD。如需詳細資訊,請參閱 AWS Encryption SDK訊息格式參考

我是否可以使用自己的主金鑰提供者?

是。實作詳細資訊會因您使用的受支援程式設計語言而異。但是,所有支持的語言都允許您定義自定義加密材料管理器 (CMM)、主密鑰提供程序、密鑰環、主密鑰和包裝密鑰。

我是否可以在一個以上的包裝金鑰下加密資料?

是。當金鑰位於不同區域或無法用於解密的情況下,您可以使用額外的包裝金鑰(或主金鑰)來加密資料金鑰。

若要在多個包裝金鑰下加密資料,請建立具有多個包裝金鑰的金鑰環或主金鑰提供者。使用 keyring 時,您可以建立具有多個包裝金鑰的單一 keyring多個 keyring

當您使用多個包裝密鑰加密數據時,AWS Encryption SDK使用一個包裝鍵來生成一個純文本的數據密鑰。數據密鑰是唯一的,在數學上與包裝鍵無關。操作會傳回純文字資料金鑰和由包裝金鑰加密的資料金鑰副本。然後,加密方法會使用其他包裝金鑰來加密資料金鑰。產生的已加密訊息包含已加密資料和每個包裝金鑰的加密資料金鑰。

您可以使用加密操作中所用的任何一個包裝金鑰來解密加密的訊息。所以此AWS Encryption SDK使用包裝金鑰來解密加密的資料金鑰。接著,使用純文字資料金鑰來解密資料。

我可以使用 AWS Encryption SDK加密哪些資料類型?

大多數程式設計語言實作AWS Encryption SDK可以加密原始位元組 (位元組陣列)、I/O 串流 (位元組串流) 和字串。所以此AWS Encryption SDK不支援 I/O 串流。我們提供每個受支援程式設計語言的範例程式碼。

AWS Encryption SDK如何加密和解密輸入/輸出 (I/O) 串流?

AWS Encryption SDK會建立加密或解密串流,來包裝基礎 I/O 串流。加密或解密串流會在讀取或寫入呼叫上執行密碼編譯操作。例如,它可以讀取基礎串流上的純文字資料,並將其加密再傳回結果。或者,它可以讀取基礎串流的加密文字,並將其解密再傳回結果。我們提供每個用於加密和解密流的範例程式碼支援程式設計語言,支持流式傳輸。

所以此AWS Encryption SDK不支援 I/O 串流。