golang实现AWS加密SDK功能的插件库aws-encryption-sdk-go的使用

Golang实现AWS加密SDK功能的插件库aws-encryption-sdk-go的使用

AWS Encryption SDK for Go

这是一个为Go编程语言实现的AWS加密SDK项目,提供了一套库,使开发者可以轻松地为他们的Go应用程序添加加密和解密功能。

动机

这个项目的动机是Go语言缺乏AWS加密SDK的实现。该SDK旨在填补这一空白,为Go开发者提供符合AWS标准的加密工具。

特性

  • 支持消息格式版本1和2以及相关算法
  • 带有发现过滤器的AWS KMS主密钥提供者
  • 使用MRK感知提供者在发现或严格模式下使用AWS KMS多区域密钥
  • 使用静态密钥的原始主密钥提供者
  • 全面的端到端测试确保与aws-encryption-sdk-cli的兼容性
  • 测试覆盖率达到100%

当前限制

  • 目前不支持KMS别名
  • 原始主密钥提供者不支持RSA加密
  • 仅支持帧内容类型

要求

  • Go v1.21或更高版本
  • AWS SDK for Go v2

安装

要安装AWS加密SDK for Go,使用以下命令:

$ go get github.com/chainifynet/aws-encryption-sdk-go@latest

使用示例

完整示例Demo

package main

import (
	"context"
	"fmt"
	
	"github.com/chainifynet/aws-encryption-sdk-go/client"
	"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"
)

func main() {
	// 1. 设置加密SDK客户端
	sdkClient := client.NewClient()
	
	// 2. 准备密钥提供者
	// 使用原始密钥提供者
	rawKeyProvider, err := rawprovider.NewWithOpts(
		"raw",
		rawprovider.WithStaticKey("static1", []byte("superSecureKeySecureKey32bytes32")),
	)
	if err != nil {
		panic("raw key provider setup failed")
	}
	
	// 或者使用KMS密钥提供者
	kmsKeyArn := "arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012"
	kmsKeyProvider, err := kmsprovider.New(kmsKeyArn)
	if err != nil {
		panic("kms key provider setup failed")
	}
	
	// 3. 创建加密材料管理器
	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")
	}
	
	fmt.Printf("Encrypted data: %x\n", ciphertext)
	fmt.Printf("Encryption header: %+v\n", header)
	
	// 5. 解密数据
	plaintext, decryptedHeader, err := sdkClient.Decrypt(context.TODO(), ciphertext, cmm)
	if err != nil {
		panic("decryption failed")
	}
	
	fmt.Printf("Decrypted data: %s\n", plaintext)
	fmt.Printf("Decrypted header: %+v\n", decryptedHeader)
}

设置客户端

import (
	"github.com/chainifynet/aws-encryption-sdk-go/client"
	"github.com/chainifynet/aws-encryption-sdk-go/clientconfig"
	"github.com/chainifynet/aws-encryption-sdk-go/suite"
)

// 默认客户端配置
sdkClient := client.NewClient()

// 自定义客户端配置
cfg, err := clientconfig.NewConfigWithOpts(
	clientconfig.WithCommitmentPolicy(suite.CommitmentPolicyRequireEncryptRequireDecrypt),
	clientconfig.WithMaxEncryptedDataKeys(3),
)
if err != nil {
	panic(err)
}

// 使用自定义配置设置客户端
sdkClient := client.NewClientWithConfig(cfg)

准备密钥提供者

// 原始密钥提供者
rawKeyProvider, err := rawprovider.NewWithOpts(
	"raw",
	rawprovider.WithStaticKey("static1", []byte("superSecureKeySecureKey32bytes32")),
)
if err != nil {
	panic("raw key provider setup failed")
}

// KMS密钥提供者
kmsKeyArn := "arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012"
kmsKeyProvider, err := kmsprovider.New(kmsKeyArn)
if err != nil {
	panic("kms key provider setup failed")
}

创建加密材料管理器

// 使用原始密钥提供者
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")
}

加密数据

// 定义加密上下文
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")
}

解密数据

// 解密数据
plaintext, header, err := sdkClient.Decrypt(context.TODO(), ciphertext, cmm)
if err != nil {
	panic("decryption failed")
}

支持和贡献

如果您遇到任何问题或想为项目做贡献,请在GitHub上提交问题或拉取请求。

许可证

该SDK根据Apache License 2.0授权。


更多关于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) 是一个用于实现客户端加密功能的库,它简化了数据加密过程并提供了强大的密钥管理功能。

安装

首先安装 SDK:

go get github.com/aws/aws-encryption-sdk-go

基本使用

1. 初始化加密客户端

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/suite"
)

func main() {
	// 创建加密客户端
	encryptionClient, err := client.NewClient()
	if err != nil {
		log.Fatalf("Error creating encryption client: %v", err)
	}

	// 创建密钥提供者 (这里使用KMS)
	kmsKeyID := "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
	cmm, err := materials.NewDefault(kmsKeyID)
	if err != nil {
		log.Fatalf("Error creating crypto materials manager: %v", err)
	}

	// 加密数据
	plaintext := []byte("This is a secret message!")
	encryptionContext := map[string]string{
		"purpose": "test",
		"origin":  "golang-app",
	}

	// 加密
	encryptedResult, err := encryptionClient.Encrypt(&client.EncryptInput{
		Plaintext:         plaintext,
		EncryptionContext: encryptionContext,
		MaterialsManager:  cmm,
	})
	if err != nil {
		log.Fatalf("Error encrypting data: %v", err)
	}

	fmt.Printf("Encrypted data (length: %d bytes)\n", len(encryptedResult.Ciphertext))

	// 解密
	decryptedResult, err := encryptionClient.Decrypt(&client.DecryptInput{
		Ciphertext: encryptedResult.Ciphertext,
		MaterialsManager: cmm,
	})
	if err != nil {
		log.Fatalf("Error decrypting data: %v", err)
	}

	fmt.Printf("Decrypted data: %s\n", string(decryptedResult.Plaintext))
	fmt.Printf("Encryption context: %v\n", decryptedResult.EncryptionContext)
}

2. 使用多个KMS密钥

// 创建使用多个KMS密钥的密钥提供者
keyIDs := []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-9876543210uv",
}

multiKeyCmm, err := materials.NewDefault(keyIDs...)
if err != nil {
	log.Fatalf("Error creating multi-key CMM: %v", err)
}

3. 使用本地密钥

import (
	"crypto/rand"
	"github.com/aws/aws-encryption-sdk-go/pkg/model"
	"github.com/aws/aws-encryption-sdk-go/pkg/providers/raw"
)

// 生成本地密钥
key := make([]byte, 32) // AES-256密钥
if _, err := rand.Read(key); err != nil {
	log.Fatalf("Error generating key: %v", err)
}

// 创建本地密钥提供者
staticKeyProvider, err := raw.NewStatic(key)
if err != nil {
	log.Fatalf("Error creating static key provider: %v", err)
}

// 创建密钥材料管理器
localCmm := model.NewDefaultCryptoMaterialsManager(staticKeyProvider)

高级功能

1. 数据密钥缓存

import "github.com/aws/aws-encryption-sdk-go/pkg/caching"

// 创建带缓存的密钥材料管理器
cache := caching.NewLocalCryptoMaterialsCache(10000) // 缓存10000个条目
cachingCmm, err := materials.NewCaching(kmsKeyID, cache)
if err != nil {
	log.Fatalf("Error creating caching CMM: %v", err)
}

2. 自定义加密算法

// 指定加密算法套件
algorithm := suite.AES_256_GCM_HKDF_SHA512_COMMIT_KEY_ECDSA_P384
customCmm, err := materials.NewDefault(kmsKeyID, materials.WithAlgorithm(algorithm))
if err != nil {
	log.Fatalf("Error creating custom algorithm CMM: %v", err)
}

3. 处理大文件

import (
	"os"
	"github.com/aws/aws-encryption-sdk-go/pkg/clientconfig"
)

// 创建支持流式处理的客户端
streamingClient, err := client.NewClientWithConfig(
	clientconfig.WithMaxEncryptedDataKeys(10), // 最大加密数据密钥数
	clientconfig.WithFrameLength(4096),       // 帧大小
)
if err != nil {
	log.Fatalf("Error creating streaming client: %v", err)
}

// 加密文件
inputFile, err := os.Open("largefile.txt")
if err != nil {
	log.Fatalf("Error opening input file: %v", err)
}
defer inputFile.Close()

outputFile, err := os.Create("largefile.txt.encrypted")
if err != nil {
	log.Fatalf("Error creating output file: %v", err)
}
defer outputFile.Close()

_, err = streamingClient.EncryptStream(
	context.Background(),
	inputFile,
	outputFile,
	cmm,
	encryptionContext,
)
if err != nil {
	log.Fatalf("Error encrypting stream: %v", err)
}

最佳实践

  1. 始终使用加密上下文 - 加密上下文可以帮助验证数据完整性
  2. 监控密钥使用情况 - 通过AWS CloudTrail监控KMS密钥使用
  3. 定期轮换密钥 - 即使使用客户端加密也应定期轮换密钥
  4. 测试解密流程 - 确保加密后能够成功解密
  5. 处理加密元数据 - 加密结果包含重要元数据,需要妥善保存

AWS Encryption SDK for Go 提供了强大的客户端加密功能,同时与AWS KMS无缝集成,简化了密钥管理过程。通过合理配置,可以实现高安全性的数据保护方案。

回到顶部