文档中心>密钥管理系统>实践教程>数据密钥(DEK)实践教程

数据密钥(DEK)实践教程

最近更新时间:2025-08-11 17:09:21

我的收藏

概述

数据密钥(Data Encryption Key,DEK)是腾讯云密钥管理系统(KMS)中用于实际数据加密的二级密钥,由根密钥(Customer Master Key,CMK)生成并保护。DEK 遵循信封加密(Envelope Encryption)架构,通过 "CMK 保护 DEK、DEK 加密数据" 的分层设计,在保障安全性的同时显著提升加解密性能。


功能特点

安全易用
采用 “信封加密” 模式,DEK 直接加密业务数据(文件、数据库字段、交易报文等),而 DEK 自身的明文仅在内存中临时存在,其密文由根密钥(CMK)加密保护。这种分层设计使 “数据加密” 与 “密钥管理” 解耦,避免高频数据加密操作直接依赖 CMK,同时实现密钥权限的分级管控。
细粒度权限控制
通过腾讯云 CAM(访问管理)实现 DEK 操作权限隔离,可精确控制哪些子账号有哪些资源的操作权限。
全链路审计
DEK 操作(生成、解密、删除)均记录在腾讯云操作审计(CloudAudit)中,日志包含操作人、时间、密钥资源等细节,以适用于合规审计要求。
跨地域容灾
KMS 支持将数据密钥进行跨地域同步,保障数据密钥的高可用性、容灾恢复、合规性等。

操作步骤

步骤一:数据密钥(DEK)的创建

腾讯云密钥管理系统(KMS)支持通过控制台或者 API 的方式生成数据密钥(DEK)。

通过控制台创建 DEK

登录 密钥管理系统(合规) 控制台,在左侧导航栏中,单击密钥管理 > 数据密钥。参考 创建数据密钥 文档,按照实际应用场景创建数据密钥(DEK)。

通过云 API 创建 DEK

参考 生成数据密钥 API 文档,生成数据密钥。示例:使用指定的 CMK 生成数据密钥(DEK)。
输入示例
POST / HTTP/1.1
Host: kms.tencentcloudapi.com
Content-Type: application/json
X-TC-Action: GenerateDataKey
<公共请求参数>

{
"KeyId": "93866e69-9755-11ef-8e65-52540089bc41",
"KeySpec": "AES_256",
"NumberOfBytes": 32,
"EncryptionContext": "{\\"key1\\":\\"value1\\"}",
"EncryptionPublicKey": "-----BEGIN PUBLIC KEY-----\\nMFkwEwYHKoZIzj0CAQYIKoEcz****srLVydfJiHQuh2Jr9lMspgK58UVMJTvQCAU+Hztyhd6Aw==\\n-----END PUBLIC KEY-----",
"EncryptionAlgorithm": "SM2"
}
输出示例
{
"Response": {
"CiphertextBlob": "GPJUsGlmPcSjHKIktXGyzn33yestz+7NteW36M6FuL8hPfJ1xVfdO6Akr8sF69x3yBXMwto4njumJMIsi9WKow==-k-XqqalxTyNKIC1rITRePFGQ==-k-xAL9z9eXIHV/p+WT1RsHP3dm6f43bkomXjwmvWdMXH+JQoFORTThfXgcRh1f9lPNLENK4+fCOiQVG1VvLdA0RvcuRvU=",
"KeyId": "93866e69-9755-11ef-8e65-52540089bc41",
"Plaintext": "q+EouJ/tGeiZIo9/tIl2baxQOBFxcN0PNn7F6EIEvpDR6kvQmHohD5PTbUCKPkct6K8jOiYpbuaWZthxco0phMRSE4+HpB17rX4jmlW8pw3eHWOZo8yRyq/c7RVVo0+DtZofszwhMirQyjcBTJWhLt7xywtE5zqhDjngeEktAEw=",
"RequestId": "044e823a-7a0c-4603-b03c-e99be5df998d"
}
}

步骤二:数据加解密调试与应用

KMS 提供 AES-CBC 模式和 AES-GCM 模式的加解密调试工具,实际使用中推荐使用 AES-GCM 模式进行业务数据的加解密。

步骤1:加密测试

1. 登录 密钥管理系统(合规) 控制台,在左侧导航栏中,单击密钥管理
2. 在密钥管理页面的使用场景模块,单击本地加解密 > 示例代码

3. 在本地加解密调试工具中,选择符合业务场景的加密算法/模式、需要测试验证的数据密钥,输入明文数据后,单击加密。
4. 在本地加解密调试工具中,KMS 会根据您选择的不同加密算法/模式生成对应的密文数据。


步骤2:解密验证

1. 在本地加解密调试工具中,单击本地解密调试工具,系统会自动输入上一步数据加密生成的密文数据以及相关内容。
2. 单击解密,验证明文数据是否与测试的明文数据一致。


步骤3:预封装加解密示例代码

KMS 支持 Java、Go 和 Python 三种语言的示例代码。验证完成后,您可以单击复制,将示例代码应用到业务代码中,实现数据加解密。


步骤三:通过云 API 获取数据密钥

查询数据密钥列表
cred = credential.Credential("AKIDxxxxxx", "xxxxxxx")
# 实例化要请求产品的client对象,clientProfile是可选的
client = kms_client.KmsClient(cred, "ap-guangzhou")
# 实例化一个请求对象,每个接口都会对应一个request对象
req = models.ListDataKeysRequest()
req.from_json_string(json.dumps(params))
# 返回的resp是一个ListDataKeysResponse的实例,与请求对象对应
resp = client.ListDataKeys(req)
# 输出json格式的字符串回包
print(resp.to_json_string())
查询数据密钥明文
credential.Credential("AKIDxxxxxx", "xxxxxxx")
client = kms_client.KmsClient(cred, "ap-guangzhou")
# 实例化一个请求对象,每个接口都会对应一个request对象
req = models.GetDataKeyPlaintextRequest()
params = {
"DataKeyId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
req.from_json_string(json.dumps(params))
# 返回的resp是一个GetDataKeyPlaintextResponse的实例,与请求对象对应
resp = client.GetDataKeyPlaintext(req)
# 输出json格式的字符串回包
print(resp.to_json_string())
响应中的 Plaintext 即是数据密钥 Base64 编码后的明文,对其进行 Base64 解码后即为数据密钥明文数据。

步骤四:业务代码中使用数据密钥

用户使用 KMS 数据密钥的整体过程可以概括为以下四步:
1. 填充 AKSK 以创建云 API 访问客户端。
2. 填充数据密钥的 DataKeyId 以查询数据密钥的密文。
3. 填充数据密钥明文到加密函数 encrypt 中进行数据加密。
4. 填充数据密钥明文到解密函数 decrypt 中进行数据解密。
#填充AKSK
cred = credential.Credential("AKIDxxxxxx", "xxxxxxx")
client = kms_client.KmsClient(cred, "ap-guangzhou")

# 实例化一个请求对象,每个接口都会对应一个request对象
req = models.GetDataKeyPlaintextRequest()
params = {
"DataKeyId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
req.from_json_string(json.dumps(params))
resp = client.GetDataKeyPlaintext(req)
# base64 解码数据密钥
key_plaintext = base64.b64decode(resp.DataKeyPlaintext)

# 加密
plaintext = b'hello,world'
ciphertext, iv, auth_tag = encrypt plaintext, key_plaintext, AESModes.AES_256_GCM)

#解密
decrypted = decrypt(ciphertext, key_plaintext, iv, auth_tag, AESModes.AES_256_GCM)

说明:
第 1、2 步在进程启动时调用一次即可。
第 2 步得到的数据密钥明文建议在内存中直接缓存,以提高程序性能。
第 3、4 步的加解密接口参考封装代码中的接口,请根据业务实际场景进行使用。
严禁将数据密钥明文进行打印或落盘存储,数据密钥明文仅允许在内存中临时缓存。

更多应用场景

DEK 生命周期管理

DEK 禁用与启用

DEK 禁用与启用功能可实时阻断高危密钥的风险扩散(禁用),并在风险解除后快速恢复业务加解密能力(启用)​,形成安全应急与业务连续性的关键控制闭环。
1. 登录 密钥管理系统(合规) 控制台,在左侧导航栏中,单击密钥管理 > 数据密钥
2. 参考 启用/禁用数据密钥 文档,对相关密钥进行禁用/启用操作。

DEK 删除销毁

为避免数据密钥的误删除,计划删除的密钥需要等待最少 7 天时间才会被彻底删除,期间用户可以取消删除以及取消禁用。
1. 登录 密钥管理系统(合规) 控制台,在左侧导航栏中,单击密钥管理 > 数据密钥
2. 参考 删除数据密钥 文档,对已确定不再使用的数据密钥进行删除操作。

DEK 权限管控

创建好数据密钥后,您可通过访问管理(CAM)对子用户进行细粒度的资源与操作授权。
降低误操作或恶意操作导致密钥泄露的风险。
适用于等保2.0/ISO 27001等合规要求(如“分权分责”)。
精细化控制加密操作的影响范围。
示例:
仅允许子用户 10000922**** 访问 KMS 的云API接口:GetServiceStatus和GenerateDataKey;
仅允许子用户 10000922**** 使用密钥资源 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx。
{
"version": "2.0",
"statement": [
{
"effect": "allow",
"action": [
"kms:GetServiceStatus",
"kms:GenerateDataKey"
],
"resource": "qcs:kms:uin/10000922****:key/creatorUin/10000922****/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
"
}
]
}

DEK 操作与审计

在腾讯云 操作审计(CloudAudit) 服务中,记录了密钥管理系统服务的相关操作事件。您可以通过该服务查询具体账户在何时通过何种接口访问了哪些数据密钥资源。具体操作步骤可参考 查看审计日志 文档。