使用golang实现aes-gcm加密解密文件需生成密钥和nonce,步骤如下:1. 使用crypto/rand生成32字节密钥与12字节nonce;2. 通过aes.newcipher与cipher.newgcm创建gcm实例;3. 调用seal方法加密并写入nonce与密文;4. 解密时读取nonce并使用open方法验证完整性;注意密钥不可硬编码,nonce必须唯一。

在实际开发中,文件加密存储是一个常见的需求,尤其是在处理敏感数据时。Golang 提供了强大的标准库支持 AES 加密算法,而 GCM(Galois/Counter Mode)模式不仅提供了加密能力,还自带认证功能,是目前比较推荐的一种加密方式。

下面我们就来看看如何在 Golang 中使用 AES-GCM 实现安全的文件加密与解密。
生成密钥和初始化向量(IV)
AES-GCM 要求一个合适的密钥和一个唯一的初始化向量(也叫 nonce)。密钥长度必须符合 AES 的要求,比如 AES-256 需要 32 字节的密钥。
立即学习“go语言免费学习笔记(深入)”;

建议做法:
- 使用
crypto/rand包生成强随机密钥 - 每次加密都使用新的、唯一且不可重复的 nonce
示例代码片段:

key := make([]byte, 32) // AES-256 key size
if _, err := io.ReadFull(rand.Reader, key); err != nil {
log.Fatal(err)
}
nonce := make([]byte, 12) // GCM recommended nonce size
if _, err := io.ReadFull(rand.Reader, nonce); err != nil {
log.Fatal(err)
}注意:密钥需要妥善保存,通常不会直接硬编码在程序中,而是通过配置或密钥管理系统获取。
使用 AES-GCM 对文件进行加密
Golang 的 crypto/cipher 包中提供了 NewGCM 接口,可以方便地创建 GCM 模式实例。
加密步骤如下:
- 打开原始文件并读取内容
- 创建 AES cipher 并包装为 GCM 模式
- 使用
Seal方法执行加密操作 - 将 nonce 和加密后的数据写入输出文件
代码示意:
block, _ := aes.NewCipher(key)
gcm, _ := cipher.NewGCM(block)
fileData, _ := os.ReadFile("input.txt")
encryptedData := gcm.Seal(nil, nonce, fileData, nil)
// 写入 nonce + 加密数据,便于后续解密使用
outFile, _ := os.Create("encrypted.bin")
outFile.Write(nonce)
outFile.Write(encryptedData)这里将 nonce 一起写入输出文件是合理的,因为 nonce 不需要保密,但必须每次加密不同。
解密文件并验证完整性
解密过程相对简单,但需要注意几个关键点:
- 必须使用相同的密钥和 nonce
- GCM 自带认证机制,因此解密失败可能意味着数据被篡改
解密步骤:
- 从文件中读取 nonce(前 12 字节)
- 初始化 AES-GCM
- 使用
Open方法尝试解密数据
示例代码:
data, _ := os.ReadFile("encrypted.bin")
nonce, encrypted := data[:12], data[12:]
block, _ := aes.NewCipher(key)
gcm, _ := cipher.NewGCM(block)
decryptedData, err := gcm.Open(nil, nonce, encrypted, nil)
if err != nil {
log.Fatal("解密失败,可能是密钥错误或数据被篡改")
}
os.WriteFile("decrypted.txt", decryptedData, 0644)GCM 的 AEAD 特性保证了解密时自动验证数据完整性,这比手动加 HMAC 更简洁安全。
安全注意事项与优化建议
- 密钥管理:不要硬编码密钥,考虑使用环境变量、配置中心或硬件安全模块(HSM)
- nonce 唯一性:确保每次加密使用的 nonce 都是唯一的,否则会严重削弱安全性
- 文件分块处理:大文件建议按块读取处理,避免一次性加载全部内容到内存
- 错误处理:上面的例子省略了错误检查,实际项目中应完整处理所有 error 返回值
基本上就这些。AES-GCM 在 Go 中实现起来不复杂,但细节上容易忽略,尤其是密钥和 nonce 的管理,稍有不慎就会埋下安全隐患。










