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

1 回复

更多关于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
}

最佳实践

  1. 始终使用加密上下文:加密上下文可以帮助验证数据的完整性,并且不会影响加密强度。

  2. 监控KMS配额:大量加密操作可能会达到KMS API配额限制,考虑使用数据密钥缓存。

  3. 处理大文件:对于大文件,考虑使用流式处理而不是一次性加载到内存。

  4. 密钥轮换:定期轮换KMS密钥以提高安全性。

  5. 错误处理:妥善处理所有可能的错误,特别是网络相关的错误。

AWS Encryption SDK for Go 提供了强大的加密功能,同时简化了与AWS KMS的集成。通过合理配置,可以满足大多数应用的数据保护需求。

回到顶部