本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
AWS Encryption SDK中的概念
本節介紹 AWS Encryption SDK 中使用的概念,並提供詞彙表和參考。它旨在幫助您了解AWS Encryption SDK工作原理以及我們用來描述它的術語。
需要幫助?
封套加密
加密資料的安全性有一部分取決於保護能夠解密資料的資料金鑰。加密處理金鑰是保護資料金鑰的一種最佳實務。若要這麼做,您需要另一個加密金鑰,稱為金鑰加密金鑰或包裝金鑰。使用包裝金鑰來加密資料金鑰的做法稱為信封加密。
- 保護資料金鑰
-
使用唯一的資料金鑰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用來加密資料的資料金鑰。每個純文本數據密鑰可以在一個或多個包裝密鑰下進行加密。當您設定金鑰圈或主要金鑰提供者時,您可以決定使用哪些包裝金鑰來保護您的資料。
注意
包裝金鑰是指金鑰圈或主要金鑰提供者中的金鑰。主密鑰通常與您使用主密鑰提供者時實例化的MasterKey
類相關聯。
AWS Encryption SDK支援數種常用的包裝金鑰,例如 AWS Key Management Service (AWS KMS) 對稱金鑰 AWS KMS keys(包括多區域 KMS 金鑰)、原始 AES-GCM (進階加密標準/Galois 計數器模式) 金鑰,以及原始 RSA 金鑰。您也可以擴展或實現自己的包裝鍵。
使用信封加密時,您需要保護包裝密鑰免受未經授權的訪問。您可以透過下列任何一種方式執行此操作:
-
使用專為這個用途所設計的 Web 服務,例如 AWS Key Management Service (AWS KMS)
。 -
使用硬體安全模組 (HSM)
,例如 AWS CloudHSM 所提供的功能。 -
使用其他金鑰管理工具和服務。
如果您沒有金鑰管理系統,則建議您使用 AWS KMS。與AWS Encryption SDK整合可協AWS KMS助您保護和使用包裝金鑰。但是,AWS Encryption SDK不需要AWS或任何AWS服務。
金鑰圈和主金鑰提供者
若要指定用於加密和解密的包裝金鑰,請使用金鑰環 (C、C# /.NET 和 JavaScript) 或主要金鑰提供者 (Java、Python、CLI)。您可以使用提AWS Encryption SDK供或設計您自己實作的金鑰環和主要金鑰提供者。根據語言限制,AWS Encryption SDK提供彼此相容的金鑰環和主金鑰提供者。如需詳細資訊,請參閱 Keyring 相容性。
Keying 會產生、加密和解密資料金鑰。定義金鑰環時,您可以指定加密資料金鑰的包裝金鑰。大多數金鑰圈至少會指定一個包裝金鑰或提供並保護包裝金鑰的服務。您也可以使用額外的配置選項來定義鑰匙圈,也可以定義更複雜的鑰匙圈。如需選擇和使用AWS Encryption SDK定義之鑰匙圈的說明,請參閱使用 keyring。在 C、C#/ .NET 和版本 3 中都支持密鑰環。 JavaScript 的 x 的適用於 JAVA 的 AWS Encryption SDK。
主要金鑰提供者是金鑰圈的替代方案。主金鑰提供者會傳回您指定的包裝金鑰 (或主金鑰)。每個主金鑰都關聯至一個主金鑰提供者,但主金鑰提供者通常可提供多個主金鑰。Java、Python 和AWS加密 CLI 支援主要金鑰提供者。
您必須為加密指定金鑰環 (或主要金鑰提供者)。您可以指定相同的金鑰環 (或主要金鑰提供者) 或不同的金鑰環來進行解密。加密時,AWS Encryption SDK會使用您指定的所有包裝金鑰來加密資料金鑰。解密時,僅AWS Encryption SDK使用您指定的包裝金鑰來解密加密的資料金鑰。指定用於解密的包裝密鑰是可選的,但這是一種AWS Encryption SDK最佳實踐。
如需有關指定環繞鍵的詳細資訊,請參閱選擇包裝鍵。
加密內容
為了改進密碼編譯操作的安全性,請在所有加密資料請求中包含加密內容。使用加密內容是選用的,但卻是建議的密碼編譯最佳實務。
加密內容是一組名稱/值對,其中包含任意非私密的額外驗證資料。加密內容可以包含您選擇的任何資料,但通常包含有利於記錄和追蹤的資料,例如有關檔案類型、用途或擁有權的資料。當您加密資料時,加密內容會以密碼演算法繫結至加密的資料,因此在解密資料時需要相同的加密內容。AWS Encryption SDK 在它傳回的已加密訊息的標頭中,以純文字包含加密內容。
AWS Encryption SDK使用的加密內容包含您指定的加密內容以及加密材料管理員 (CMM) 新增的公開 key pair。具體而言,當您使用加密演算法搭配簽署時,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 在傳回純文字資料之前會驗證值是否存在於已加密訊息的加密內容中。
-
在其他程式設計語言實作中,解密回應包括加密內容和純文字資料。您應用程式中的解密函數在傳回純文字資料之前,應該一律驗證解密回應中的加密內容包含解密請求中的加密內容 (或子集)。
注意
使用版本 4。 AWS Encryption SDK適用於 .NET 和版本 3 的 x。 x 的 適用於 JAVA 的 AWS Encryption SDK,您可以在具有必要加密內容 CMM 的所有加密請求中要求具有加密內容。
選擇加密內容時,請記住,它不是秘密。加密內容會以純文字顯示在傳回的加密郵件標頭中AWS Encryption SDK。如果您使用 AWS Key Management Service,加密內容也可能出現在稽核記錄和日誌的純文字中,例如 AWS CloudTrail。
如需在程式碼中提交和驗證加密內容的範例,請參閱您慣用程式設計語言的範例。
加密的訊息
使用 AWS Encryption SDK 加密資料時,它會傳回加密的訊息。
加密訊息是一種可攜式格式化的資料結構,其中包含加密的資料以及資料金鑰的加密副本、演算法識別碼,以及選擇性地加密內容和數位簽章。AWS Encryption SDK中的加密操作會傳回已加密訊息,而解密操作會將已加密訊息當做輸入。
結合加密的資料與其加密的資料金鑰可以簡化解密操作,您也不用再將加密的資料金鑰,於其進行加密的資料分開來存放和管理。
如需已加密訊息的相關技術資訊,請參閱加密的訊息格式。
演算法套件
AWS Encryption SDK使用演算法套件來加密和簽署加密訊息中的資料,加密和解密作業會傳回。AWS Encryption SDK 支援數個演算法套件。所有支援的套件都使用進階加密標準 (AES) 做為主要演算法,並將它與其他演算法和值結合。
AWS Encryption SDK會建立建議的演算法套件做為所有加密操作的預設套件。預設套件可能隨著標準和最佳實務改進而變更。您可以在要求加密資料或建立加密材料管理員 (CMM) 時指定替代演算法套件,但除非您的情況需要其他演算法套件,否則最好使用預設值。目前的預設值為 AES-GCM,具有 HMAC 型 extract-and-expand 金鑰衍生函
如果您的應用程式需要高效能,而且正在加密資料的使用者和解密資料的使用者都受到同等信任,您可以考慮指定沒有數位簽章的演算法套件。但是,我們強烈建議使用包含金鑰承諾和金鑰衍生函數的演算法套件。沒有這些功能的演算法套件僅支援回溯相容性。
密碼編譯資料管理員
密碼材料管理器(CMM)組合用於加密和解密數據的加密材料。密碼編譯資料包含純文字和加密的資料金鑰,以及選用的訊息簽署金鑰。您永遠不會直接與 CMM 互動。加密和解密方法會為您代勞。
您可以使用預設 CMM 或AWS Encryption SDK提供的快取 CMM,或撰寫自訂 CMM。你可以指定一個 CMM,但它不是必需的。當您指定金鑰環或主要金鑰提供者時,會為您AWS Encryption SDK建立預設 CMM。預設 CMM 會從您指定的金鑰環或主要金鑰提供者取得加密或解密資料。這可能牽涉到呼叫密碼編譯服務,例如 AWS Key Management Service (AWS KMS)。
由於 CMM 充當AWS Encryption SDK和金鑰環 (或主要金鑰提供者) 之間的聯絡,因此它是自訂和延伸 (例如對原則強制執行和快取的支援) 的理想選擇。AWS Encryption SDK 提供快取 CMM 來支援資料金鑰快取。
對稱和非對稱加密
對稱加密使用相同的金鑰來加密和解密資料。
非對稱加密使用與數學相關的資料 key pair。配對中的一個金鑰會加密資料;只有配對中的另一個金鑰可以解密資料。如需詳細資訊,請參閱加密服務和工具指南中的AWS加密演算法。
使AWS Encryption SDK用信封加密。它使用對稱數據密鑰加密您的數據。它使用一個或多個對稱或非對稱包裝密鑰對稱數據密鑰進行加密。它返回一個加密的消息,其中包括加密的數據和數據密鑰的至少一個加密副本。
主要承諾
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 版中引入了對關鍵承諾的 Support。 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最佳實務。
承諾政策有三個價值觀。
注意
您可能必須水平或垂直捲動才能看到整個表格。
承諾政策價值 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
值 | 使用金鑰承諾進行加密 | 無需金鑰承諾即可加密 | 使用關鍵承諾進行解密 | 無需金鑰承諾即可解密 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ForbidEncryptAllowDecrypt | ![]() |
![]() |
![]() |
![]() |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
RequireEncryptAllowDecrypt | ![]() |
![]() |
![]() |
![]() |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
RequireEncryptRequireDecrypt | ![]() |
![]() |
![]() |
![]() |
承諾政策設置在AWS Encryption SDK版本 1.7 中引入。 x. 它在所有支持的編程語言中都有效。
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鑰做為包裝金鑰,這表示具有 KMS 解密權限的使用者可以在不呼叫 KMS Encrypt 的情況下建立加密的加密文字。
為避免此問題,AWS Encryption SDK支援在加密郵件結尾加入橢圓曲線數位簽章演算法 (ECDSA) 簽章。使用簽署演算法套件時,會為每個加密訊息AWS Encryption SDK產生一個暫時的私密金鑰和公開 key pair。會將公開金鑰AWS Encryption SDK儲存在資料金鑰的加密內容中,並捨棄私密金鑰,而且沒有人可以建立另一個使用公開金鑰進行驗證的簽章。因為演算法會將公開金鑰與加密的資料金鑰做為訊息標頭中的其他驗證資料繫結,因此只能解密郵件的使用者無法更改公開金鑰。
簽名驗證在解密方面會增加顯著的效能成本。如果加密資料的使用者和解密資料的使用者同樣受到信任,請考慮使用不包含簽章的演算法套件。