golang AWS数据加密与解密SDK插件库aws-encryption-sdk-go的使用
Golang AWS数据加密与解密SDK插件库aws-encryption-sdk-go的使用
简介
AWS Encryption SDK for Go是为Go编程语言实现的AWS加密SDK,它提供了一组库,使开发者能够轻松地为Go应用程序添加加密和解密功能。这个实现受到aws-encryption-sdk-python的启发,并严格遵循AWS加密SDK规范。
功能特性
- 支持消息格式版本1和2及相关算法
- 带有发现过滤器的AWS KMS主密钥提供程序
- 使用MRK感知提供程序在发现或严格模式下支持AWS KMS多区域密钥
- 使用静态密钥的原始主密钥提供程序
- 确保与aws-encryption-sdk-cli兼容的全面端到端测试
- 测试覆盖率达到100%
当前限制
- 目前不支持KMS别名
- 原始主密钥提供程序不支持RSA加密
- 仅支持帧内容类型
安装要求
- Go v1.21或更高版本
- AWS SDK for Go v2
安装
使用以下命令安装AWS Encryption SDK for Go:
$ go get github.com/chainifynet/aws-encryption-sdk-go@latest
使用示例
1. 设置客户端
默认客户端配置
import (
"github.com/chainifynet/aws-encryption-sdk-go/client"
"github.com/chainifynet/aws-encryption-sdk-go/clientconfig"
"github.com/chainifynet/aws-encryption-sdk-go/materials"
"github.com/chainifynet/aws-encryption-sdk-go/providers/kmsprovider"
"github.com/chainifynet/aws-encryption-sdk-go/providers/rawprovider"
"github.com/chainifynet/aws-encryption-sdk-go/suite"
)
// 使用默认配置设置加密SDK客户端
sdkClient := client.NewClient()
自定义客户端配置(高级)
// 使用自定义客户端配置设置加密SDK客户端
cfg, err := clientconfig.NewConfigWithOpts(
clientconfig.WithCommitmentPolicy(suite.CommitmentPolicyRequireEncryptRequireDecrypt),
clientconfig.WithMaxEncryptedDataKeys(3),
)
if err != nil {
panic(err) // 处理错误
}
// 使用自定义配置设置加密SDK客户端
sdkClient := client.NewClientWithConfig(cfg)
2. 准备密钥提供程序
使用静态密钥的原始密钥提供程序
rawKeyProvider, err := rawprovider.NewWithOpts(
"raw",
providers.WithStaticKey("static1", []byte("superSecureKeySecureKey32bytes32")),
)
if err != nil {
panic("raw key provider setup failed") // 处理错误
}
使用KMS CMK的KMS密钥提供程序
// 用于加密和解密的KMS密钥ARN
kmsKeyArn := "arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012"
// 设置KMS密钥提供程序
kmsKeyProvider, err := kmsprovider.New(kmsKeyArn)
if err != nil {
panic("kms key provider setup failed") // 处理错误
}
3. 创建加密材料管理器
使用原始密钥提供程序的加密材料管理器
cmm, err := materials.NewDefault(rawKeyProvider)
if err != nil {
panic("materials manager setup failed") // 处理错误
}
使用KMS密钥提供程序的加密材料管理器
cmm, err := materials.NewDefault(kmsKeyProvider)
if err != nil {
panic("materials manager setup failed") // 处理错误
}
同时使用KMS和原始密钥提供程序的加密材料管理器
cmm, err := materials.NewDefault(kmsKeyProvider, rawKeyProvider)
if err != nil {
panic("materials manager setup failed") // 处理错误
}
4. 数据加密
// 定义加密上下文,这是一组表示额外认证数据的键值对
encryptionContext := map[string]string{
"purpose": "test",
}
// 要加密的数据
secretData := []byte("secret data to encrypt")
// 加密数据
ciphertext, header, err := sdkClient.Encrypt(
context.TODO(),
secretData,
encryptionContext,
cmm,
)
if err != nil {
panic("encryption failed") // 处理错误
}
5. 数据解密
// 解密数据
plaintext, header, err := sdkClient.Decrypt(context.TODO(), ciphertext, cmm)
if err != nil {
panic("decryption failed") // 处理错误
}
许可证
此SDK根据Apache License 2.0许可。有关详细信息,请参阅LICENSE文件。
如需了解更多关于如何使用此SDK的信息,请参考example
目录和文档中的详细API参考。
更多关于golang AWS数据加密与解密SDK插件库aws-encryption-sdk-go的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang AWS数据加密与解密SDK插件库aws-encryption-sdk-go的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
AWS Encryption SDK for Go 使用指南
AWS Encryption SDK for Go (aws-encryption-sdk-go
) 是一个用于数据加密和解密的客户端库,支持使用AWS KMS、AWS CloudHSM和其他密钥提供程序。
安装
go get github.com/aws/aws-encryption-sdk-go
基本用法
1. 初始化加密客户端
import (
"github.com/aws/aws-encryption-sdk-go/pkg/client"
"github.com/aws/aws-encryption-sdk-go/pkg/materials"
"github.com/aws/aws-encryption-sdk-go/pkg/providers/kms"
)
func getEncryptionClient() (*client.Client, error) {
// 使用KMS密钥ID初始化密钥提供程序
kmsKeyID := "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
kmsProvider, err := kms.New(kmsKeyID)
if err != nil {
return nil, err
}
// 创建加密材料管理器
cmm, err := materials.NewDefault(kmsProvider)
if err != nil {
return nil, err
}
// 创建加密客户端
encryptionClient := client.NewClient()
return encryptionClient, nil
}
2. 加密数据
func encryptData(plaintext []byte) ([]byte, error) {
encryptionClient, err := getEncryptionClient()
if err != nil {
return nil, err
}
// 加密上下文(可选但推荐)
encryptionContext := map[string]string{
"purpose": "test",
"origin": "golang-app",
}
// 执行加密
result, err := encryptionClient.Encrypt(&client.EncryptInput{
Plaintext: plaintext,
EncryptionContext: encryptionContext,
})
if err != nil {
return nil, err
}
return result.Ciphertext, nil
}
3. 解密数据
func decryptData(ciphertext []byte) ([]byte, error) {
encryptionClient, err := getEncryptionClient()
if err != nil {
return nil, err
}
// 执行解密
result, err := encryptionClient.Decrypt(&client.DecryptInput{
Ciphertext: ciphertext,
})
if err != nil {
return nil, err
}
// 验证加密上下文(可选但推荐)
expectedContext := map[string]string{
"purpose": "test",
"origin": "golang-app",
}
for k, v := range expectedContext {
if result.EncryptionContext[k] != v {
return nil, fmt.Errorf("encryption context mismatch for key %s", k)
}
}
return result.Plaintext, nil
}
高级用法
使用多个KMS密钥
func getMultiKeyEncryptionClient() (*client.Client, error) {
// 多个KMS密钥ID
kmsKeyIDs := []string{
"arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
"arn:aws:kms:us-east-1:111122223333:key/0987zyxw-98zy-76xw-54vu-321098765432",
}
kmsProvider, err := kms.New(kmsKeyIDs...)
if err != nil {
return nil, err
}
cmm, err := materials.NewDefault(kmsProvider)
if err != nil {
return nil, err
}
return client.NewClient(), nil
}
使用数据密钥缓存
import (
"github.com/aws/aws-encryption-sdk-go/pkg/caching"
)
func getCachingEncryptionClient() (*client.Client, error) {
kmsKeyID := "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
kmsProvider, err := kms.New(kmsKeyID)
if err != nil {
return nil, err
}
// 配置缓存
cache := caching.NewLocalCryptoMaterialsCache(10000) // 缓存容量
cmm := materials.NewCaching(kmsProvider, cache)
return client.NewClient(), nil
}
完整示例
package main
import (
"fmt"
"log"
"github.com/aws/aws-encryption-sdk-go/pkg/client"
"github.com/aws/aws-encryption-sdk-go/pkg/materials"
"github.com/aws/aws-encryption-sdk-go/pkg/providers/kms"
)
func main() {
// 原始数据
originalData := []byte("这是一些需要加密的敏感数据")
// 加密
encrypted, err := encryptData(originalData)
if err != nil {
log.Fatalf("加密失败: %v", err)
}
fmt.Printf("加密后的数据长度: %d\n", len(encrypted))
// 解密
decrypted, err := decryptData(encrypted)
if err != nil {
log.Fatalf("解密失败: %v", err)
}
fmt.Printf("解密后的数据: %s\n", string(decrypted))
fmt.Printf("原始数据和解密数据是否一致: %t\n", string(originalData) == string(decrypted))
}
func getEncryptionClient() (*client.Client, error) {
kmsKeyID := "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
kmsProvider, err := kms.New(kmsKeyID)
if err != nil {
return nil, err
}
cmm, err := materials.NewDefault(kmsProvider)
if err != nil {
return nil, err
}
return client.NewClient(), nil
}
func encryptData(plaintext []byte) ([]byte, error) {
encryptionClient, err := getEncryptionClient()
if err != nil {
return nil, err
}
encryptionContext := map[string]string{
"purpose": "demo",
"app": "aws-encryption-sdk-go-example",
}
result, err := encryptionClient.Encrypt(&client.EncryptInput{
Plaintext: plaintext,
EncryptionContext: encryptionContext,
})
if err != nil {
return nil, err
}
return result.Ciphertext, nil
}
func decryptData(ciphertext []byte) ([]byte, error) {
encryptionClient, err := getEncryptionClient()
if err != nil {
return nil, err
}
result, err := encryptionClient.Decrypt(&client.DecryptInput{
Ciphertext: ciphertext,
})
if err != nil {
return nil, err
}
// 验证加密上下文
expectedContext := map[string]string{
"purpose": "demo",
"app": "aws-encryption-sdk-go-example",
}
for k, v := range expectedContext {
if result.EncryptionContext[k] != v {
return nil, fmt.Errorf("encryption context mismatch for key %s", k)
}
}
return result.Plaintext, nil
}
最佳实践
-
始终使用加密上下文:加密上下文可以帮助验证数据的完整性,并且不会影响加密强度。
-
监控KMS配额:大量加密操作可能会达到KMS API配额限制,考虑使用数据密钥缓存。
-
处理大文件:对于大文件,考虑使用流式处理而不是一次性加载到内存。
-
密钥轮换:定期轮换KMS密钥以提高安全性。
-
错误处理:妥善处理所有可能的错误,特别是网络相关的错误。
AWS Encryption SDK for Go 提供了强大的加密功能,同时简化了与AWS KMS的集成。通过合理配置,可以满足大多数应用的数据保护需求。