

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

# AWS KMS 密碼編譯基本概念
<a name="kms-cryptography"></a>

AWS KMS 使用可設定的密碼編譯演算法，讓系統可以快速從一個核准的演算法或模式遷移到另一個演算法。針對安全屬性和效能，已從聯邦資訊處理標準 (經 FIPS 核准) 演算法中選取初始預設的密碼編譯演算法集。

如需偏好和可接受的密碼編譯演算法的詳細資訊，請參閱 [支援的密碼編譯演算法](supported-algorithms.md)。

## 熵和隨機數字產生
<a name="entropy-and-random-numbers"></a>

AWS KMS 金鑰產生會在 AWS KMS HSMs中執行。HSM 會實作混合式隨機數字產生器，其使用[採用 AES-256 的 NIST SP800-90A 決定性隨機位元產生器](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-90Ar1.pdf)。它植入了具有 384 位元熵的非決定性隨機位元產生器，並使用額外的熵進行更新，以便在每次呼叫加密材料時提供預測阻力。

## 對稱金鑰操作 (僅限加密)
<a name="symmetric-key-0ps"></a>

HSM 中使用的所有對稱金鑰加密命令都會使用[進階加密標準 (AES)](http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf)，採用 256 位元金鑰的 [Galois 計數器模式 (GCM)](http://csrc.nist.gov/publications/nistpubs/800-38D/SP-800-38D.pdf)。要解密的類似呼叫使用反函數。

AES-GCM 是經過驗證的加密配置。除了加密純文字以產生加密文字，它還會針對加密文字和需要身分驗證的任何其他資料 (另外驗證的資料或 AAD) 運算身分驗證標籤。身分驗證標籤有助於確保資料來自所宣稱的來源，而且加密文字和 AAD 尚未修改。

通常， AWS 會省略在我們的描述中包含 AAD，特別是在參考資料金鑰加密時。這些情況下的周圍文字會暗示，在要加密純文字和要保護純文字 AAD 之間會進行分區的要加密結構。

AWS KMS 提供您將金鑰材料匯入 的選項， AWS KMS key 而不是依賴 AWS KMS 產生金鑰材料。此匯入的金鑰材料可以使用 [RSAES-OAEP](https://datatracker.ietf.org/doc/html/rfc8017#section-7.1) 加密，以在傳輸到 AWS KMS HSM 期間保護金鑰。RSA 金鑰對會在 AWS KMS HSMs上產生。匯入的金鑰材料會在 AWS KMS HSM 上解密，並在服務儲存之前在 AES-GCM 下重新加密。

## 非對稱金鑰操作 (加密、數位簽章和簽章驗證)
<a name="asymmetric-key-ops"></a>

AWS KMS 支援將非對稱金鑰操作用於加密、數位簽章和金鑰協議操作。非對稱金鑰操作依賴數學上相關的公有金鑰和私有金鑰對，可用於加密和解密、簽署和簽章驗證，*或*衍生共用秘密。私有金鑰永遠不會讓 AWS KMS 處於未加密狀態。您可以呼叫 AWS KMS API 操作 AWS KMS ，在 中使用公有金鑰，或下載公有金鑰並在 外部使用 AWS KMS。

AWS KMS 支援下列非對稱密碼。
+ **RSA-OAEP (用於加密) 與 RSA-PSS 和 RSA-PKCS-\$11-v1\$15 (用於簽署和驗證)** – 針對不同的安全要求，支援 RSA 金鑰長度 (以位元為單位)：2048、3072 和 4096。
+ **橢圓曲線 (ECC)** – 用於簽署和驗證或衍生共用秘密，但不能同時用於兩者。支援 ECC 曲線：NIST P256, P384, P521、SECP 256k1、Ed25519。
+ **ML-DSA** – 用於簽署和驗證。支援的 ML-DSA 金鑰規格為：ML\$1DSA\$144、ML\$1DSA\$165 和 ML\$1DSA\$187。
+ **SM2 （僅限中國區域）** – 用於加密和解密、簽署和驗證，或衍生共用秘密，但您必須選擇一個金鑰用量。支援用於加密的 SM2PKE 和用於簽署的 SM2DSA。

## 金鑰衍生函數
<a name="key-derivation-functions"></a>

金鑰衍生函數用於從初始秘密或金鑰衍生其他金鑰。 AWS KMS 使用金鑰衍生函數 (KDF) 來衍生 下每個加密的每個呼叫金鑰 AWS KMS key。所有 KDF 操作均會使用 [計數器模式中的 KDF](https://nvlpubs.nist.gov/nistpubs/legacy/sp/nistspecialpublication800-108.pdf) (使用 HMAC [[FIPS197]](http://csrc.nist.gov/publications/fips/fips198-1/FIPS-198-1_final.pdf) 與 SHA256 [[FIPS180]](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf))。256 位元衍生金鑰與 AES-GCM 搭配使用，以加密或解密客戶資料和金鑰。

## AWS KMS 內部使用數位簽章
<a name="digital-signatures"></a>

數位簽章也可用來對命令和 AWS KMS 實體之間的通訊進行身分驗證。所有服務實體都有橢圓曲線數位簽章演算法 (ECDSA) 金鑰對。其執行[密碼編譯訊息語法 (CMS) 中橢圓曲線密碼編譯 (ECC) 演算法的使用](https://datatracker.ietf.org/doc/html/rfc5753/)和 X9.62-2005：*金融服務業的公有金鑰密碼編譯：橢圓曲線數位簽章演算法 (ECDSA)*中所定義的 ECDSA。實體使用[聯邦資訊處理標準出版物 FIPS PUB 180-4 (稱為 SHA384)](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf) 中所定義的安全雜湊演算法。金鑰於曲線 secp384r1 (NIST-P384) 產生。

## 封套加密
<a name="enveloping"></a>

加密資料後，您的資料會受到保護，但您需要保護您的加密金鑰。一個策略是把它加密。*封套加密*是使用資料金鑰來加密純文字資料，然後再透過另一個金鑰來加密資料金鑰的實務做法。

您甚至可以透過另一個加密金鑰來加密資料加密金鑰，並透過另一個加密金鑰來加密該加密金鑰。但是，最終必須有一個金鑰保留在純文字中，以便您可以解密金鑰和您的資料。這個最上層的純文字金鑰加密金鑰稱為*根金鑰*。

![\[封套加密\]](http://docs.aws.amazon.com/zh_tw/kms/latest/developerguide/images/key-hierarchy-root.png)


AWS KMS 可協助您安全地存放和管理加密金鑰，以保護您的加密金鑰。存放在 中的根金鑰 AWS KMS，稱為 AWS KMS keys，永遠不會讓 AWS KMS [FIPS 140-3 安全層級 3 驗證的硬體安全模組](https://csrc.nist.gov/projects/cryptographic-module-validation-program/certificate/4884)處於未加密狀態。若要使用 KMS 金鑰，您必須呼叫 AWS KMS。

在許多密碼編譯系統中使用的基本結構是信封加密。信封加密使用兩個或多個密碼編譯金鑰來保護訊息。通常，一個金鑰是從較長期的靜態金鑰 *k*，另一個金鑰是每條訊息金鑰 *msgKey* (這是為了加密訊息而產生的)。信封是透過加密訊息：*ciphertext = Encrypt(msgKey, message) * 形成的。然後訊息金鑰使用長期靜態金鑰：*encKey = Encrypt(k, msgKey) * 進行加密。最後，將這兩個值* (encKey, ciphertext) *封裝成單一結構或信封加密訊息。

收件人 (可存取 *k*) 可以先解密加密的金鑰，然後解密訊息，以開啟封住的訊息。

AWS KMS 可讓您管理這些長期靜態金鑰，並自動化資料的信封加密程序。

除了 AWS KMS 服務內提供的加密功能之外，[AWS Encryption SDK](https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/introduction.html) 還提供用戶端信封加密程式庫。您可以使用這些程式庫來保護您的資料和用來加密該資料的加密金鑰。

![\[使用多個金鑰加密金鑰的封套加密\]](http://docs.aws.amazon.com/zh_tw/kms/latest/developerguide/images/key-hierarchy-kms-key.png)


封套加密提供多種優勢：
+ **保護資料金鑰**

  加密資料金鑰時，您不需要擔心如何存放加密的資料金鑰，因為這份資料金鑰本質上已獲得加密保護。加密的資料金鑰可以安全地跟加密資料一起存放。
+ **在多個金鑰下加密相同的資料**

  加密操作可能極為耗時，特別是要加密的資料屬於大型物件時，更為明顯。這時您可以捨棄使用不同金鑰來多次重新加密原始資料的做法，改成只重新加密負責保護原始資料的資料金鑰。
+ **結合多種演算法的優勢**

  一般而言，比起公開金鑰演算法，對稱金鑰演算法速度較快，產生的加密文字較小。但是，公開金鑰演算法本質上就會區隔角色，因此金鑰管理較為方便。封套加密可讓您結合每個策略的優點。

## 密碼編譯操作
<a name="cryptographic-operations"></a>

在 中 AWS KMS，*密碼編譯操作*是使用 KMS 金鑰保護資料的 API 操作。由於 KMS 金鑰保留在 內 AWS KMS，您必須呼叫 AWS KMS 在密碼編譯操作中使用 KMS 金鑰。

若要使用 KMS 金鑰執行密碼編譯操作，請使用 AWS SDKs、 AWS Command Line Interface (AWS CLI) 或 AWS Tools for PowerShell。您無法在 AWS KMS 主控台中執行密碼編譯操作。如需以數種程式設計語言呼叫密碼編譯操作的範例，請參閱[AWS KMS 使用 AWS SDKs程式碼範例](service_code_examples.md)。

下表列出 AWS KMS 密碼編譯操作。它也會顯示操作中使用之 KMS 金鑰的金鑰類型和[金鑰使用情形](create-keys.md#key-usage)需求。


| 作業 | Key type | 金鑰用途 | 
| --- | --- | --- | 
| [解密](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html) | 對稱或不對稱 | ENCRYPT\$1DECRYPT | 
| [DeriveSharedSecret](https://docs.aws.amazon.com/kms/latest/APIReference/API_DeriveSharedSecret.html) | 非對稱 | KEY\$1AGREEMENT | 
| [加密](https://docs.aws.amazon.com/kms/latest/APIReference/API_Encrypt.html) | 對稱或不對稱 | ENCRYPT\$1DECRYPT | 
| [GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html) | 對稱  | ENCRYPT\$1DECRYPT | 
| [GenerateDataKeyPair](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKeyPair.html) | 對稱 [1]不支援自訂金鑰存放區中的 KMS 金鑰。 | ENCRYPT\$1DECRYPT | 
| [GenerateDataKeyPairWithoutPlaintext](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKeyPairWithoutPlaintext.html) | 對稱 [1]不支援自訂金鑰存放區中的 KMS 金鑰。 | ENCRYPT\$1DECRYPT | 
| [GenerateDataKeyWithoutPlaintext](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKeyWithoutPlaintext.html) | 對稱 | ENCRYPT\$1DECRYPT | 
| [GenerateMac](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateMac.html) | HMAC | GENERATE\$1VERIFY\$1MAC | 
| [GenerateRandom](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateRandom.html) | N/A。此操作不會使用 KMS 金鑰。 | N/A | 
| [ReEncrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_ReEncrypt.html) | 對稱或不對稱 | ENCRYPT\$1DECRYPT | 
| [符號](https://docs.aws.amazon.com/kms/latest/APIReference/API_Sign.html) | 非對稱 | SIGN\$1VERIFY | 
| [確認](https://docs.aws.amazon.com/kms/latest/APIReference/API_Verify.html) | 非對稱 | SIGN\$1VERIFY | 
| [VerifyMac](https://docs.aws.amazon.com/kms/latest/APIReference/API_VerifyMac.html) | HMAC | GENERATE\$1VERIFY\$1MAC | 

[1] 產生受對稱加密 KMS 金鑰保護的非對稱資料金鑰對。

如需密碼編譯操作許可的詳細資訊，請參閱[AWS KMS 許可](kms-api-permissions-reference.md)。

為了讓所有使用者 AWS KMS 都能回應並發揮高功能， 會在每秒呼叫的密碼編譯操作數量上 AWS KMS 建立配額。如需詳細資訊，請參閱[密碼編譯操作的共用配額](requests-per-second.md#rps-shared-limit)。