更新时间:2025-09-17 GMT+08:00
分享

敏感信息加解密(小量数据加解密)

敏感信息加密是密钥管理系统 KMS 核心的能力,把小于 4 KB 的敏感数据(密钥、证书、配置)直接拿根密钥(CMK)加密成密文,全程不落盘;用时只在内存解密,传输强制 HTTPS,明文不出内存、不进磁盘、不留日志,确保敏感数据安全。

若需要通过 KMS 对海量数据进行高性能的加解密服务,请参见信封加密场景。

敏感信息举例

敏感信息

用途

丢失风险

密钥证书

加密业务数据,通信通道,数字签名

保密信息被盗、加密通道遭监听、签名被伪造

后台配置文件

保存系统架构和其他业务信息,例如数据库 IP、密码

业务数据被拖库、成为攻击其他系统的跳板

加解密原理

以保护服务器HTTPS证书为例,采用调用KMS的API接口方式进行说明,如图1所示。

图1 保护服务器HTTPS证书

前期准备

  • 获取华为云开发工具包(SDK)并完成安装。
  • 您需要拥有华为云租户账号以及该账号对应的 Access Key(AK)和 Secret Access Key(SK)。请在华为云控制台我的凭证 > 访问密钥页面上创建和查看您的AK/SK。

操作指导

  1. 创建用户主密钥,算法为AES_256。具体操作请参见创建密钥
  2. 敏感信息加解密。

    1. 控制台方式

      在线工具适合处理单次或者非批量的加解密操作,例如首次生成密钥密文,开发者无需为非批量的加解密操作而去开发额外的工具,将精力集中在实现核心业务能力上,详细操作请参见在线工具加解密小数据

    2. GO 方式

      通过 Encrypt 来针对用户的数据进行加密,用于加密的数据大小最多为4KB任意数据,可用于加密数据库密码,RSA Key,或其它较小的敏感信息。本文示例使用 GO 语言实现,您也可以使用其它支持的编程语言。

      调用KMS的加密数据密钥接口,使用指定的用户主密钥将明文证书加密为密文证书。

      GO 代码示例

      package main
      
      import (
        "log"
        "os"
      
        "github.com/huaweicloud/huaweicloud-sdk-go-v3/core/auth/basic"
        "github.com/huaweicloud/huaweicloud-sdk-go-v3/core/config"
        "github.com/huaweicloud/huaweicloud-sdk-go-v3/core/region"
        kms "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/kms/v2"
        kmsModel "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/kms/v2/model"
      )
      
      const plainText = "Hello World!"
      
      // 认证用的ak和sk直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;
      // 本示例以ak和sk保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。
      var ak = os.Getenv("HUAWEICLOUD_SDK_AK")
      var sk = os.Getenv("HUAWEICLOUD_SDK_SK")
      var iamEndpoint = "https://<IAM_ENDPOINT>"
      var endpoint = "<ENDPOINT>"
      var regionID = "<REGION_ID>"
      
      func main() {
      
        // 用户主密钥ID
        keyId := "xxxxxxxx-xxx-xxx-xxxx-xxxxxxxxxxx1"
      
        // 1.准备认证信息
        auth := basic.NewCredentialsBuilder().
          WithAk(ak).
          WithSk(sk).
          WithIamEndpointOverride(iamEndpoint).
          Build()
      
        httpConfig := config.DefaultHttpConfig()
        httpConfig.WithIgnoreSSLVerification(true)
      
        // 2.初始化SDK,传入认证信息与KMS的终端信息
        client := kms.NewKmsClient(
          kms.KmsClientBuilder().
            WithRegion(region.NewRegion(regionID, endpoint)).
            WithHttpConfig(httpConfig).
            WithCredential(auth).
            Build())
      
        // 3.加密数据
        encryptDataRequest := kmsModel.EncryptDataRequest{
          Body: &kmsModel.EncryptDataRequestBody{KeyId: keyId, PlainText: plainText},
        }
        encryptDataResponse, err := client.EncryptData(&encryptDataRequest)
        if err != nil {
          log.Fatal("Encrypt data occur error.")
        }
      
        // 4.解密数据
        decryptDataRequest := kmsModel.DecryptDataRequest{
          Body: &kmsModel.DecryptDataRequestBody{KeyId: &keyId, CipherText: *encryptDataResponse.CipherText},
        }
        decryptDataResponse, err := client.DecryptData(&decryptDataRequest)
        if err != nil {
          log.Fatal("Decrypt data occur error.")
        }
      
        // 5.比对解密结果
        log.Printf("result is %t", *decryptDataResponse.PlainText == plainText)
      }

相关文档