敏感信息加解密(小量数据加解密)
敏感信息加密是密钥管理系统 KMS 核心的能力,把小于 4 KB 的敏感数据(密钥、证书、配置)直接拿根密钥(CMK)加密成密文,全程不落盘;用时只在内存解密,传输强制 HTTPS,明文不出内存、不进磁盘、不留日志,确保敏感数据安全。
若需要通过 KMS 对海量数据进行高性能的加解密服务,请参见信封加密场景。
敏感信息举例
敏感信息 |
用途 |
丢失风险 |
---|---|---|
密钥证书 |
加密业务数据,通信通道,数字签名 |
保密信息被盗、加密通道遭监听、签名被伪造 |
后台配置文件 |
保存系统架构和其他业务信息,例如数据库 IP、密码 |
业务数据被拖库、成为攻击其他系统的跳板 |
前期准备
- 获取华为云开发工具包(SDK)并完成安装。
- 您需要拥有华为云租户账号以及该账号对应的 Access Key(AK)和 Secret Access Key(SK)。请在华为云控制台 页面上创建和查看您的AK/SK。
操作指导
- 创建用户主密钥,算法为AES_256。具体操作请参见创建密钥。
- 敏感信息加解密。
- 控制台方式
在线工具适合处理单次或者非批量的加解密操作,例如首次生成密钥密文,开发者无需为非批量的加解密操作而去开发额外的工具,将精力集中在实现核心业务能力上,详细操作请参见在线工具加解密小数据。
- 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) }
- 控制台方式