KMS 加密解密

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 项目里)

原文地址:https://www.cnblogs.com/chanix/p/12739024.html