tencent cloud

密钥管理系统

产品简介
产品概述
产品优势
应用场景
基本概念
购买指南
计费概述
购买方式
续费说明
欠费说明
控制台指南
入门概述
密钥管理
访问控制
审计
TCCLI 管理指南
操作总览
创建密钥
查看密钥
编辑密钥
启用禁用密钥
密钥轮换
对称密钥加解密
非对称密钥解密
删除密钥
实践教程
对称加解密
非对称加解密
KMS 后量子密码实践
外部密钥导入
指数回退策略应对服务限频
云产品集成 KMS 实现透明加密
API 文档
History
Introduction
API Category
Key APIs
Making API Requests
Asymmetric Key APIs
Data Types
Error Codes
服务等级协议
常见问题
一般性问题
开发接入相关问题
KMS 政策
隐私政策
数据处理和安全协议
联系我们
词汇表

操作指南

PDF
聚焦模式
字号
最后更新时间: 2024-01-11 16:31:21
本实践指南以 Python 为例,其它语言类似。

前期准备

示例代码依赖环境:Python 2.7。
KMS 产品服务开通:从 腾讯云控制台 开通 KMS 产品。
云 API 密钥服务开通:获取 SecretID、SecretKey 以及调用地址(endpoint),KMS 的调用地址为 kms.tencentcloudapi.com,具体参考各产品说明。
SDK 安装:执行以下命令,详细可见 tencentcloud-sdk-python github 开源项目。
pip install tencentcloud-sdk-python

操作流程

您可以通过以下3个步骤完成信封加密场景的操作。
1. 创建主密钥 CMK。
2. 数据信封加密,业务程序通过 API 调用 KMS GenerateDataKey 接口生成数据密钥,系统通过明文密钥将数据加密,并将密文密钥和密文落盘。
3. 数据读取解密,系统读取密文密钥和密文,通过 KMS 解密接口解密密文密钥,返回明文密钥,最后通过明文密钥解密密文数据。

实践步骤

步骤1:创建主密钥 CMK

主密钥 CMK 的创建指南,请参见 创建密钥 快速入门文档。

步骤2:数据信封加密

根据业务需求,在需要新的 DEK 时(例如针对新的用户需要进行加密,或者 DEK 复用超过一定时间,使用新的 DEK 等),可通过 KMS 接口创建新的数据密钥。生成数据密钥后在内存中使用明文密钥加密,最后将密文和密文密钥落盘。

生成数据密钥并对用户数据进行加密

通过 GenerateDataKey 来获取数据密钥 DEK,数据加密密钥是基于 CMK 生成的二级密钥,可用于用户本地数据加密解密。KMS 对 DEK 不做保存管理,需要调用方进行存储。
本文示例使用腾讯云 Python SDK 实现,您也可以使用其它支持的编程语言调用。
该 API 操作的 KeyId 为必选参数,您可以查看 GenerateDataKey 接口文档来查看其它参数说明。

Python SDK 示例

# -*- coding: utf-8 -*-
import base64
from Crypto.Cipher import AES
from tencentcloud.common import credential
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.kms.v20190118 import kms_client, models

def KmsInit(region="ap-guangzhou", secretId="", secretKey=""):
try:
credProfile = credential.Credential(secretId, secretKey)
client = kms_client.KmsClient(credProfile, region)
return client
except TencentCloudSDKException as err:
print(err)
return None

def GenerateDatakey(client, keyId, keyspec='AES_128'):
try:
req = models.GenerateDataKeyRequest()
req.KeyId = keyId
req.KeySpec = keyspec
# 调用生成数据密钥接口
generatedatakeyResp = client.GenerateDataKey(req)
# 明文密钥需要在内存中使用,密文密钥用于持久化存储
print "DEK cipher=", generatedatakeyResp.CiphertextBlob
return generatedatakeyResp
except TencentCloudSDKException as err:
print(err)

def AddTo16(value):
while len(value) % 16 != 0:
value += '\\0'
return str.encode(value)

# 用户自定义逻辑,此处仅作为参考
def LocalEncrypt(dataKey="", plaintext=""):
aes = AES.new(base64.b64decode(dataKey), AES.MODE_ECB)
encryptedData = aes.encrypt(AddTo16(plaintext))
ciphertext = base64.b64encode(encryptedData)
print "plaintext=", plaintext, ", cipher=", ciphertext

if __name__ == '__main__':
# 用户自定义参数
secretId = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
secretKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
region = "ap-guangzhou"
keyId = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
keySpec = "AES_256"
plaintext = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

client = KmsInit(region, secretId, secretKey)
rsp = GenerateDatakey(client, keyId, keySpec)

LocalEncrypt(rsp.Plaintext, plaintext)

步骤3:数据读取解密

先读取落盘的密文密钥,并通过调用解密接口,解密密文密钥。最后根据解密出的明文密钥解密数据。

解密(KMS Python SDK)

通过 Decrypt 来针对用户的数据进行解密。
本文示例使用腾讯云 Python SDK实现,后续您可以使用任何支持的编程语言调用。
该 API 操作的 CiphertextBlob 为必选参数,您可以查看 Decrypt 接口文档来查看其它参数说明。

Python SDK 示例

将 DEK 密文密钥通过调用 KMS 解密接口进行解密,然后用获取的 DEK 明文解密用户数据密文。
# -*- coding: utf-8 -*-
import base64
from Crypto.Cipher import AES
from tencentcloud.common import credential
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.kms.v20190118 import kms_client, models

def KmsInit(region="ap-guangzhou", secretId="", secretKey=""):
try:
credProfile = credential.Credential(secretId, secretKey)
client = kms_client.KmsClient(credProfile, region)
return client
except TencentCloudSDKException as err:
print(err)
return None

def DecryptDataKey(client, ciphertextBlob):
try:
req = models.DecryptRequest()
req.CiphertextBlob = ciphertextBlob
rsp = client.Decrypt(req) #调用解密接口对 DEK 解密
return rsp
except TencentCloudSDKException as err:
print(err)

# 用户自定义逻辑,此处仅作为参考
def LocalDecrypt(dataKey="", ciphertext=""):
aes = AES.new(base64.b64decode(dataKey), AES.MODE_ECB)
decryptedData = aes.decrypt(base64.b64decode(ciphertext))
plaintext = str(decryptedData)
print "plaintext=", plaintext, ", cipher=", ciphertext

if __name__ == '__main__':
# 用户自定义参数
secretId = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
secretKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
region = "ap-guangzhou"
dekCipherBlob="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
ciphertext="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

client = KmsInit(region, secretId, secretKey)
rsp = DecryptDataKey(client, dekCipherBlob)

LocalDecrypt(rsp.Plaintext, ciphertext)


帮助和支持

本页内容是否解决了您的问题?

填写满意度调查问卷,共创更好文档体验。

文档反馈