KMS 加密解密
2019/07/04 Chenxin
參考:
https://docs.aws.amazon.com/zh_cn/kms/index.html
https://docs.aws.amazon.com/zh_cn/kms/latest/developerguide/kms-dg.pdf (PDF在磁盤里).
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/kms.html#kms (API,SDK參考)
https://boto3.amazonaws.com/v1/documentation/api/latest/index.html (BOTO3參考)
術語和概念
KMS
Key Management Service (AWS KMS)
CMK
Customer Master Key 客戶主密鑰 (CMK).通過KMS來管理你的CMK.AWS 賬戶中有三種類型的 CMK:客戶托管 CMK(我們需要用的)、AWS 托管 CMK(用戶可見,但不可管理.aws一些服務自帶的) 和 AWS 擁有的 CMK(用戶不可見的)。
信封加密
(對明文密鑰1次或多次進行加密)AWS KMS 中的主要資源是客戶主密鑰 (CMK)。可以使用 CMK 加密和解密最多 4 KB(4096 字節)的數據。通常情況下,您可以使用 CMK 生成/加密/解密 數據密鑰,您在 AWS KMS 之外使用這些密鑰來加密您的數據。此策略稱為信封加密。
信封加密 是一種加密方法,它使用 數據密鑰 對 玩家明文數據 進行加密,然后使用 其他密鑰 對 該明文數據密鑰 再進行加密。
您也可以使用 其他加密密鑰 對 數據加密密鑰 進行再加密,並且在 另一個加密密鑰下 加密 此加密密鑰。但是,最后,一個密鑰一定會以明文形式保留,以便您可以 解密密鑰和數據。此頂層明文密鑰(加密密鑰)稱為主密鑰CMK。
AWS KMS 可通過安全地 存儲和管理 主密鑰 來幫助您保護它們。存儲在 KMS 中的 主密鑰(稱為客戶主密鑰(CMK))絕不會讓 AWS KMS 經 FIPS 驗證的硬件安全模塊 處於不加密狀態。要使用 CMK,您必須調用 KMS。
信封加密可提供以下多種優勢:
- 保護數據密鑰: 加密數據密鑰時,您無需擔心存儲 加密數據密鑰(因為它本身就受到加密保護)。您可以安全地將 加密數據 與 加密數據密鑰 一起存儲。
- 使用多個主密鑰加密相同數據: 加密操作可能非常耗時。您可以 只重新加密保護 原始數據的數據密鑰 ,而無需使用不同的密鑰多次重新加密原始數據。
- 結合多種算法的優勢: 對稱密鑰算法 比 公有密鑰算法 速度更快,且生成的密文也較小.但公有密鑰算法可提供 固有的角色分離和 更輕松的密鑰管理。信封加密可以把每種策略的優勢結合起來。
數據密鑰
數據密鑰 是可用於加密數據的加密密鑰,包括 大量數據 和 其他數據 加密密鑰 。
您可以使用 AWS KMS 客戶主密鑰 (CMK) 生成、加密和解密 數據密鑰。AWS KMS 不會存儲、管理或跟蹤您的數據密鑰,也不會使用數據密鑰執行加密操作。您必須在 AWS KMS 之外使用和管理數據密鑰。
創建數據密鑰
要創建數據密鑰,請調用 GenerateDataKey 操作。AWS KMS 使用您指定的 CMK 來生成數據密鑰。
此操作會返回 數據密鑰的明文副本 和 借助CMK加密的數據密鑰的副本 .
KMS 利用 CMK ->通過 Encryption Algorithm (加密算法) -> 數據密鑰的明文副本+數據密鑰的密文副本(可以再通過KMS來解密得到明文的).
使用數據密鑰加密數據
AWS KMS 無法使用數據密鑰來加密數據,但您可以在 KMS 之外使用數據密鑰,例如使用 OpenSSL 或 AWS 加密 SDK 等加密庫。也就是用戶用KMS的CMK來加密用戶的 數據密鑰(可以是密文密鑰或明文密鑰,密文密鑰可以通過KMS解密獲得明文密鑰).用戶通過用戶的數據密鑰(明文)來加密自己的數據.
用戶在使用明文數據密鑰加密數據后,請盡快從內存中將其刪除。以防被黑客獲取.
您可以在S3上安全地存儲加密數據密鑰(必須通過KMS的CMK才能解密)及加密數據(必須通過用戶密鑰才能解密),以便其可根據需要用於解密數據。
使用數據密鑰解密數據
要解密數據(玩家數據),請將 加密數據密鑰 傳遞至 Decrypt 操作。AWS KMS 使用您的 CMK 解密數據密鑰,然后該函數返回純文本數據密鑰。
然后,使用 明文數據密鑰 解密數據(並盡快從內存中刪除該明文數據密鑰).
KMI
加密術的主要問題之一是很難保持密鑰的私密性。這通常是密鑰管理基礎設施 (KMI) 的工作。AWS KMS 可為您操作 KMI。AWS KMS 會創建並安全地存儲稱為 CMK 的主密鑰。
創建CMK
控制台操作(步驟略)
以下是策略視圖,在控制台上可以切換到圖像視圖(更直觀).
{
"Id": "key-consolepolicy-3",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Enable IAM User Permissions",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::923956230349:root"
},
"Action": "kms:",
"Resource": ""
},
{
"Sid": "Allow access for Key Administrators",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::923956230349:user/private_chenxin"
},
"Action": [
"kms:Create",
"kms:Describe",
"kms:Enable",
"kms:List",
"kms:Put",
"kms:Update",
"kms:Revoke",
"kms:Disable",
"kms:Get",
"kms:Delete",
"kms:TagResource",
"kms:UntagResource",
"kms:ScheduleKeyDeletion",
"kms:CancelKeyDeletion"
],
"Resource": ""
},
{
"Sid": "Allow use of the key",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::923956230349:user/private_test",
"arn:aws:iam::923956230349:user/private_chenxin"
]
},
"Action": [
"kms:Encrypt",
"kms:Decrypt",
"kms:ReEncrypt",
"kms:GenerateDataKey",
"kms:DescribeKey"
],
"Resource": ""
},
{
"Sid": "Allow attachment of persistent resources",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::923956230349:user/private_test",
"arn:aws:iam::923956230349:user/private_chenxin"
]
},
"Action": [
"kms:CreateGrant",
"kms:ListGrants",
"kms:RevokeGrant"
],
"Resource": "*",
"Condition": {
"Bool": {
"kms:GrantIsForAWSResource": "true"
}
}
}
]
}
CMK的訪問
CMK的訪問不同於訪問AWS其他服務(其他服務只需要IAM授權即可).CMK必須要有密鑰策略.(另外,還可以選擇結合IAM.)
密鑰策略,就是上面的那個JSON文件.
KMS API 使用
關於KMS API 的使用,請參考python腳本(腳本文件在aws kms 項目里)