
# 敏感信息加解密（小量数据加解密）
敏感信息加密是密钥管理系统 KMS 核心的能力，把小于 4 KB 的敏感数据（密钥、证书、配置）直接拿根密钥（CMK）加密成密文，全程不落盘；用时只在内存解密，传输强制 HTTPS，明文不出内存、不进磁盘、不留日志，确保敏感数据安全。
若需要通过 KMS 对海量数据进行高性能的加解密服务，请参见[信封加密](https://support.huaweicloud.com/bestpractice-dew/dew_06_0013.html)场景。
#### 敏感信息举例
| 敏感信息   | 用途                        | 丢失风险                 |
|:---|:---|:---|
| 密钥证书   | 加密业务数据，通信通道，数字签名          | 保密信息被盗、加密通道遭监听、签名被伪造 |
| 后台配置文件 | 保存系统架构和其他业务信息，例如数据库 IP、密码 | 业务数据被拖库、成为攻击其他系统的跳板  |
   
#### 加解密原理
以保护服务器HTTPS证书为例，采用调用KMS的API接口方式进行说明，如[图1]所示。
图1保护服务器HTTPS证书   
![](https://support.huaweicloud.com/bestpractice-dew/zh-cn_image_0000002294275361.png "点击放大")
#### 前期准备
- 获取华为云开发工具包（SDK）并完成安装。
- 您需要拥有华为云租户账号以及该账号对应的 Access Key（AK）和 Secret Access Key（SK）。请在华为云控制台"我的凭证 \> 访问密钥"页面上创建和查看您的AK/SK。
 
#### 操作指导
1. 创建用户主密钥，算法为AES_256。具体操作请参见[创建密钥](https://support.huaweicloud.com/usermanual-dew/dew_01_0178.html#dew_01_0178__section408105191602)。
2. 敏感信息加解密。 
   1. **控制台方式**
      在线工具适合处理单次或者非批量的加解密操作，例如首次生成密钥密文，开发者无需为非批量的加解密操作而去开发额外的工具，将精力集中在实现核心业务能力上，详细操作请参见[在线工具加解密小数据](https://support.huaweicloud.com/usermanual-dew/dew_01_0022.html)。
      
   
   2. **GO 方式**
      通过 Encrypt 来针对用户的数据进行加密，用于加密的数据大小最多为4KB任意数据，可用于加密数据库密码，RSA Key，或其它较小的敏感信息。本文示例使用 GO 语言实现，您也可以使用其它支持的编程语言。
      调用KMS的[加密数据密钥](https://support.huaweicloud.com/api-dew/EncryptDatakey.html)接口，使用指定的用户主密钥将明文证书加密为密文证书。
      **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)
      }
      ```
      
   
   
   
   
 
