tencent cloud

文档反馈

操作指南

最后更新时间: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)
    
    联系我们

    联系我们,为您的业务提供专属服务。

    技术支持

    如果你想寻求进一步的帮助,通过工单与我们进行联络。我们提供7x24的工单服务。

    7x24 电话支持