中的概念 AWS Encryption SDK - AWS Encryption SDK

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

中的概念 AWS Encryption SDK

本節介紹 中使用的概念 AWS Encryption SDK,並提供詞彙表和參考。它旨在協助您了解 AWS Encryption SDK 的運作方式,以及我們用來描述它的術語。

需要幫助?

封套加密

加密資料的安全性有一部分取決於保護能夠解密資料的資料金鑰。加密處理金鑰是保護資料金鑰的一種最佳實務。若要這樣做,您需要另一個加密金鑰,稱為金鑰加密金鑰包裝金鑰。使用包裝金鑰加密資料金鑰的做法稱為信封加密

保護資料金鑰

會使用唯一的資料金鑰 AWS Encryption SDK 加密每個訊息。然後,它會在您指定的包裝金鑰下加密資料金鑰。它將加密的資料金鑰與加密的資料存放在其傳回的加密訊息中。

若要指定包裝金鑰,您可以使用 keyring主金鑰提供者

使用 進行信封加密 AWS Encryption SDK
在多個包裝金鑰下加密相同的資料

您可以在多個包裝金鑰下加密資料金鑰。您可能想要為不同的使用者提供不同的包裝金鑰,或包裝不同類型的金鑰,或在不同的位置。每個包裝金鑰都會加密相同的資料金鑰。會將所有加密的資料金鑰與加密的資料 AWS Encryption SDK 存放在加密的訊息中。

若要解密資料,您需要提供可解密其中一個加密資料金鑰的包裝金鑰。

每個包裝金鑰都會加密相同的資料金鑰,導致每個包裝金鑰有一個加密的資料金鑰
結合多種演算法的優勢

為了加密您的資料, 依預設 AWS Encryption SDK 會使用複雜的演算法套件搭配 AES-GCM 對稱加密、金鑰衍生函數 (HKDF) 和簽署。若要加密資料金鑰,您可以指定適合您包裝金鑰的對稱或非對稱加密演算法

一般而言,相較於非對稱或公有金鑰加密,對稱金鑰加密演算法速度較快,產生的加密文字較小。但是,公開金鑰演算法本質上就會區隔角色,因此金鑰管理較為方便。若要結合每個 的優勢,您可以使用對稱金鑰加密來加密資料,然後使用公有金鑰加密來加密資料金鑰。

資料金鑰

資料金鑰是 AWS Encryption SDK 用來加密資料的加密金鑰。每個資料金鑰是符合密碼編譯金鑰需求的位元組陣列。除非您使用資料金鑰快取,否則 AWS Encryption SDK 會使用唯一的資料金鑰來加密每個訊息。

您不需要指定、產生、實作、延伸、保護或使用資料金鑰。 AWS Encryption SDK 會在您呼叫加密和解密操作時為您代勞。

為了保護您的資料金鑰, 會使用一或多個稱為包裝金鑰或主金鑰的金鑰加密金鑰 AWS Encryption SDK 進行加密。在 AWS Encryption SDK 使用您的純文字資料金鑰加密您的資料後,它會盡快將其從記憶體中移除。然後,將加密的資料金鑰連同加密的資料一起存放在加密操作傳回的已加密訊息中。如需詳細資訊,請參閱 AWS Encryption SDK 的運作方式

提示

在 中 AWS Encryption SDK,我們將資料金鑰資料加密金鑰區分開來。數個支援的演算法套件 (包括預設套件),使用金鑰衍生函數來防止資料金鑰達到其密碼編譯限制。金鑰衍生函數採用資料金鑰做為輸入,並傳回實際用來加密資料的資料加密金鑰。因此,我們通常會說資料是在資料金鑰「底下」加密,而不是「由」資料金鑰加密。

每個加密的資料金鑰都包含中繼資料,包括加密它的包裝金鑰的識別符。此中繼資料可讓 更輕鬆地 AWS Encryption SDK 在解密時識別有效的包裝金鑰。

包裝金鑰

包裝金鑰是金鑰加密金鑰, AWS Encryption SDK 會使用它來加密加密您資料的資料金鑰。每個純文字資料金鑰都可以在一或多個包裝金鑰下加密。當您設定 keyring主金鑰提供者時,您可以決定使用哪些包裝金鑰來保護資料。

注意

包裝金鑰是指 keyring 或主金鑰提供者中的金鑰。主金鑰通常與您在使用主金鑰提供者時執行個體化的MasterKey類別相關聯。

AWS Encryption SDK 支援數個常用的包裝金鑰,例如 AWS Key Management Service (AWS KMS) 對稱 AWS KMS keys(包括多區域 KMS 金鑰)、原始 AES-GCM (進階加密標準/Galois 計數器模式) 金鑰,以及原始 RSA 金鑰。您也可以擴展或實作自己的包裝金鑰。

當您使用信封加密時,您需要保護包裝金鑰免於未經授權的存取。您可以透過下列任何方式執行此操作:

如果您沒有金鑰管理系統,建議您使用 AWS KMS。與 AWS Encryption SDK 整合 AWS KMS ,可協助您保護和使用您的包裝金鑰。不過, AWS Encryption SDK 不需要 AWS 或任何 AWS 服務。

Keyring 和主金鑰提供者

若要指定用於加密和解密的包裝金鑰,請使用 keyring 或主金鑰提供者。您可以使用 AWS Encryption SDK 提供的 keyring 和主金鑰提供者,或設計您自己的實作。 AWS Encryption SDK 提供 keyring 和主金鑰提供者,這些提供者彼此相容,受語言限制條件約束。如需詳細資訊,請參閱 Keyring 相容性

Keying 會產生、加密和解密資料金鑰。當您定義 keyring 時,您可以指定用來加密資料金鑰的包裝金鑰。大多數 keyring 會指定至少一個包裝金鑰,或提供和保護包裝金鑰的服務。您也可以定義沒有包裝金鑰的 keyring,或具有其他組態選項的更複雜 keyring。如需選擇和使用 AWS Encryption SDK 定義之 keyring 的說明,請參閱 Keyrings

下列程式設計語言支援 Keyring:

  • 適用於 C 的 AWS Encryption SDK

  • 適用於 JavaScript 的 AWS Encryption SDK

  • AWS Encryption SDK 適用於 .NET

  • 3.x 版 適用於 JAVA 的 AWS Encryption SDK

  • 4.x 版 適用於 Python 的 AWS Encryption SDK,與選用的加密材料提供者程式庫 (MPL) 相依性搭配使用時。

  • AWS Encryption SDK 適用於 Rust 的 1.x

  • 適用於 Go 的 0.1.x AWS Encryption SDK 版或更新版本

主金鑰提供者是 keyring 的替代方案。主金鑰提供者會傳回您指定的包裝金鑰 (或主金鑰)。每個主金鑰都關聯至一個主金鑰提供者,但主金鑰提供者通常可提供多個主金鑰。Java、Python 和 AWS Encryption CLI 支援主金鑰提供者。

您必須指定 keyring (或主金鑰提供者) 以進行加密。您可以指定相同的 keyring (或主金鑰提供者) 或不同的 keyring 進行解密。加密時, AWS Encryption SDK 會使用您指定的所有包裝金鑰來加密資料金鑰。解密時, 只會 AWS Encryption SDK 使用您指定的包裝金鑰來解密加密的資料金鑰。指定用於解密的包裝金鑰是選擇性的,但這是 AWS Encryption SDK 最佳實務

如需指定包裝金鑰的詳細資訊,請參閱 選取包裝金鑰

加密內容

為了改進密碼編譯操作的安全性,請在所有加密資料請求中包含加密內容。使用加密內容是選用的,但卻是建議的密碼編譯最佳實務。

加密內容是一組名稱/值對,其中包含任意非私密的額外驗證資料。加密內容可以包含您選擇的任何資料,但通常包含有利於記錄和追蹤的資料,例如有關檔案類型、用途或擁有權的資料。當您加密資料時,加密內容會以密碼演算法繫結至加密的資料,因此在解密資料時需要相同的加密內容。 AWS Encryption SDK 在它傳回的已加密訊息的標頭中,以純文字包含加密內容。

AWS Encryption SDK 使用的加密內容包含您指定的加密內容,以及密碼編譯資料管理員 (CMM) 新增的公有金鑰對。具體而言,當您使用加密演算法搭配簽署時,CMM 會將名稱/值對新增到加密內容,其中包含預留名稱 aws-crypto-public-key 和代表公有驗證金鑰的值。加密內容中的aws-crypto-public-key名稱由 保留 AWS Encryption SDK ,不能用作加密內容中任何其他對的名稱。如需詳細資訊,請參閱訊息格式參考中的 AAD

以下範例加密內容包含請求中指定的兩個加密內容對,以及 CMM 新增的公有金鑰對。

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

若要解密資料,您需傳入已加密訊息。由於 AWS Encryption SDK 可以從加密的訊息標頭擷取加密內容,因此您不需要分別提供加密內容。不過,加密內容可協助您確認您正在解密正確的已加密訊息。

  • AWS Encryption SDK 命令列界面 (CLI),如果您在解密命令中提供加密內容,CLI 在傳回純文字資料之前會驗證值是否存在於已加密訊息的加密內容中。

  • 在其他程式設計語言實作中,解密回應包含加密內容和純文字資料。您應用程式中的解密函數在傳回純文字資料之前,應該一律驗證解密回應中的加密內容包含解密請求中的加密內容 (或子集)。

注意

下列版本支援必要的加密內容 CMM,您可以使用它來在所有加密請求中要求加密內容。

  • 3.x 版 適用於 JAVA 的 AWS Encryption SDK

  • AWS Encryption SDK 適用於 .NET 的 4.x

  • 4.x 版 適用於 Python 的 AWS Encryption SDK,與選用的加密材料提供者程式庫 (MPL) 相依性搭配使用時。

  • for Rust 的 1.x AWS Encryption SDK 版

  • 適用於 Go 的 0.1.x AWS Encryption SDK 版或更新版本

選擇加密內容時,請記住,它不是秘密。加密內容會以純文字顯示在 AWS Encryption SDK 傳回的加密訊息標頭中。如果您使用的是 AWS Key Management Service,加密內容也可能以純文字顯示在稽核記錄和日誌中,例如 AWS CloudTrail。

如需在程式碼中提交和驗證加密內容的範例,請參閱您偏好的程式設計語言範例。

加密的訊息

當您使用 加密資料時 AWS Encryption SDK,它會傳回加密的訊息。

加密訊息是一種可攜式格式化資料結構,其中包含加密的資料,以及資料金鑰、演算法 ID 的加密副本,以及選擇性的加密內容數位簽章。 AWS Encryption SDK 中的加密操作會傳回已加密訊息,而解密操作會將已加密訊息當做輸入。

結合加密的資料與其加密的資料金鑰可以簡化解密操作,您也不用再將加密的資料金鑰,於其進行加密的資料分開來存放和管理。

如需已加密訊息的相關技術資訊,請參閱加密的訊息格式

演算法套件

AWS Encryption SDK 使用演算法套件來加密和簽署加密和解密操作傳回的加密訊息中的資料。 AWS Encryption SDK 支援數個演算法套件。所有支援的套件都使用進階加密標準 (AES) 做為主要演算法,並將它與其他演算法和值結合。

會 AWS Encryption SDK 建立建議的演算法套件,做為所有加密操作的預設值。預設套件可能隨著標準和最佳實務改進而變更。您可以在加密資料的請求中或在建立密碼編譯資料管理員 (CMM) 時指定替代演算法套件,但除非情況需要替代演算法,否則最好使用預設值。目前的預設值為 AES-GCM,具有以 HMAC extract-and-expand金鑰衍生函數 (HKDF)、金鑰承諾橢圓曲線數位簽章演算法 (ECDSA) 簽章,以及 256 位元加密金鑰。

如果您的應用程式需要高效能,而且加密資料的使用者和解密資料的使用者同樣受信任,您可以考慮指定沒有數位簽章的演算法套件。不過,我們強烈建議使用演算法套件,其中包含金鑰承諾和金鑰衍生函數。沒有這些功能的演算法套件僅支援向後相容性。

密碼編譯資料管理員

密碼編譯資料管理員 (CMM) 會組合用於加密和解密資料的密碼編譯資料。密碼編譯資料包含純文字和加密的資料金鑰,以及選用的訊息簽署金鑰。您永遠不會直接與 CMM 互動。加密和解密方法會為您代勞。

您可以使用 AWS Encryption SDK 提供的預設 CMM 或快取 CMM,或撰寫自訂 CMM。您也可以指定 CMM,但不是必要項目。當您指定 keyring 或主金鑰提供者時, 會為您 AWS Encryption SDK 建立預設 CMM。預設 CMM 會從您指定的 keyring 或主金鑰提供者取得加密或解密資料。這可能牽涉到呼叫密碼編譯服務,例如 AWS Key Management Service (AWS KMS)。

由於 CMM 充當 AWS Encryption SDK 和 keyring (或主金鑰提供者) 之間的聯絡點,因此它是自訂和延伸的理想點,例如支援政策強制執行和快取。 AWS Encryption SDK 提供快取 CMM 以支援資料金鑰快取。

對稱和非對稱加密

對稱加密使用相同的金鑰來加密和解密資料。

非對稱加密使用數學上相關的資料金鑰對。配對中的一個金鑰會加密資料;只有配對中的另一個金鑰可以解密資料。

AWS Encryption SDK 使用信封加密。它使用對稱資料金鑰加密您的資料。它會使用一或多個對稱或非對稱包裝金鑰來加密對稱資料金鑰。它會傳回加密訊息,其中包含加密的資料和至少一份加密的資料金鑰副本。

加密您的資料 (對稱加密)

為了加密您的資料, AWS Encryption SDK 使用對稱資料金鑰和包含對稱加密演算法的演算法套件。若要解密資料, AWS Encryption SDK 會使用相同的資料金鑰和相同的演算法套件。

加密您的資料金鑰 (對稱或非對稱加密)

您提供給加密和解密操作的 keyring主金鑰提供者會決定對稱資料金鑰的加密和解密方式。您可以選擇使用對稱加密的 keyring 或主金鑰提供者,例如 AWS KMS keyring,或使用非對稱加密的 keyring 或 ,例如原始 RSA keyring 或 JceMasterKey

金鑰承諾

AWS Encryption SDK 支援金鑰承諾 (有時稱為穩健性),這是一種安全屬性,可確保每個加密文字只能解密為單一純文字。若要這樣做,金鑰承諾保證只會使用加密訊息的資料金鑰來解密訊息。使用金鑰承諾進行加密和解密是AWS Encryption SDK 最佳實務

大多數現代對稱密碼 (包括 AES) 會在單一私密金鑰下加密純文字,例如 AWS Encryption SDK 用來加密每個純文字訊息的唯一資料金鑰。使用相同的資料金鑰解密此資料會傳回與原始資料相同的純文字。使用不同金鑰進行解密通常會失敗。不過,可以在兩個不同的金鑰下解密加密文字。在極少數情況下,您可以找到金鑰,將幾個位元組的加密文字解密為不同的但仍然無法理解的純文字。

AWS Encryption SDK 一律在一個唯一的資料金鑰下加密每個純文字訊息。它可能會在多個包裝金鑰 (或主金鑰) 下加密該資料金鑰,但包裝金鑰一律會加密相同的資料金鑰。不過,複雜的手動製作加密訊息實際上可能包含不同的資料金鑰,每個金鑰都由不同的包裝金鑰加密。例如,如果一個使用者解密加密的訊息,則傳回 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 版開始, AWS Encryption SDK 支援一項承諾政策,可設定預設演算法套件,並限制可使用的演算法套件。此政策會判斷您的資料是否使用金鑰承諾進行加密和解密。

金鑰承諾會導致稍大 (+ 30 位元組) 加密訊息,並需要更多時間來處理。如果您的應用程式對大小或效能非常敏感,您可以選擇不接收金鑰承諾。但只有在您必須這麼做時,才這麼做。

如需遷移至 1.7.x 和 2.0.x 版的詳細資訊,包括其金鑰承諾功能,請參閱 遷移您的 AWS Encryption SDK。如需金鑰承諾的技術資訊,請參閱 AWS Encryption SDK 演算法參考AWS Encryption SDK 訊息格式參考

承諾政策

承諾政策是一種組態設定,可判斷您的應用程式是否使用金鑰承諾來加密和解密。使用金鑰承諾進行加密和解密是AWS Encryption SDK 最佳實務

承諾政策有三個值。

注意

您可能需要水平或垂直捲動才能查看整個資料表。

承諾政策值
Value 使用金鑰承諾加密 在沒有金鑰承諾的情況下加密 使用金鑰承諾解密 在沒有金鑰承諾的情況下解密
ForbidEncryptAllowDecrypt Red circle with white X inside, indicating prohibition or cancellation. Green checkmark icon indicating approval or confirmation. Green checkmark icon indicating approval or confirmation. Green checkmark icon indicating approval or confirmation.
RequireEncryptAllowDecrypt Green checkmark icon indicating approval or confirmation. Red circle with white X inside, indicating prohibition or cancellation. Green checkmark icon indicating approval or confirmation. Green checkmark icon indicating approval or confirmation.
RequireEncryptRequireDecrypt Green checkmark icon indicating approval or confirmation. Red circle with white X inside, indicating prohibition or cancellation. Green checkmark icon indicating approval or confirmation. Red circle with white X inside, indicating prohibition or cancellation.

承諾政策設定會在 1.7.x AWS Encryption SDK 版中推出。它適用於所有支援的程式設計語言

  • ForbidEncryptAllowDecrypt 會在有或沒有金鑰承諾的情況下解密,但不會使用金鑰承諾進行加密。此值在 1.7.x 版中推出,旨在準備執行您應用程式的所有主機,在遇到加密的加密文字與金鑰承諾之前,先以金鑰承諾解密。

  • RequireEncryptAllowDecrypt 一律使用金鑰承諾加密。它可以在有或沒有金鑰承諾的情況下解密。此值在 2.0.x 版中推出,可讓您開始加密金鑰承諾,但仍解密舊版密碼文字,而不需要金鑰承諾。

  • RequireEncryptRequireDecrypt 僅使用金鑰承諾來加密和解密。此值是 2.0.x 版的預設值。當您確定所有加密文字都已透過金鑰承諾加密時,請使用此值。

承諾政策設定決定您可以使用哪些演算法套件。從 1.7.x 版開始, AWS Encryption SDK 支援用於金鑰承諾的演算法套件;含 和 不含簽署。如果您指定與您的承諾政策衝突的演算法套件, AWS Encryption SDK 會傳回錯誤。

如需設定承諾政策的協助,請參閱 設定您的承諾政策

數位簽章

使用已驗證的 AWS Encryption SDK 加密演算法 AES-GCM 加密您的資料,解密程序會驗證加密訊息的完整性和真實性,而不需使用數位簽章。但由於 AES-GCM 使用對稱金鑰,任何可以解密用於解密加密文字的資料金鑰的人,也可以手動建立新的加密加密加密文字,進而引發潛在的安全問題。例如,如果您使用 AWS KMS key 做為包裝金鑰,具有 kms:Decrypt 許可的使用者可以建立加密的密碼文字,而無需呼叫 kms:Encrypt

為了避免此問題, AWS Encryption SDK 支援將橢圓曲線數位簽章演算法 (ECDSA) 簽章新增至加密訊息的結尾。使用簽署演算法套件時, 會為每個加密的訊息 AWS Encryption SDK 產生臨時私有金鑰和公有金鑰對。會將公有金鑰 AWS Encryption SDK 存放在資料金鑰的加密內容中,並捨棄私有金鑰。這可確保沒有人可以建立另一個使用公有金鑰驗證的簽章。演算法會將公有金鑰繫結到加密的資料金鑰,做為訊息標頭中的其他已驗證資料,防止只能解密訊息的使用者更改公有金鑰或影響簽章驗證。

簽章驗證在解密時會增加高昂的效能成本。如果加密資料的使用者和解密資料的使用者同樣受信任,請考慮使用不包含簽署的演算法套件。

注意

如果封裝密碼編譯材料的 keyring 或存取權未在加密程式和解密程式之間劃定,數位簽章不會提供密碼編譯值。

AWS KMS keyring,包括非對稱 RSA AWS KMS keyring,可以根據 AWS KMS 金鑰政策和 IAM 政策,在加密程式和解密程式之間劃定。

由於其密碼編譯性質,下列 keyring 無法在加密程式和解密程式之間描述:

  • AWS KMS 階層式 keyring

  • AWS KMS ECDH keyring

  • 原始 AES keyring

  • 原始 RSA keyring

  • 原始 ECDH keyring