推荐使用AES-256-GCM模式,配合PBKDF2派生密钥、随机12字节nonce、文件权限0600及内存清零,实现机密性与完整性兼顾的安全加解密。

使用Golang实现AES加密与解密,核心在于正确选择模式(推荐AES-256-CBC或AES-256-GCM)、安全生成和管理密钥与初始化向量(IV),并严格遵循加解密流程。Golang标准库crypto/aes和crypto/cipher已提供完整支持,无需第三方依赖。
准备密钥与初始化向量(IV)
AES-256要求32字节密钥,IV长度必须为16字节(CBC/GCM模式)。切勿硬编码或复用IV——每次加密都应生成新随机IV。
- 使用
crypto/rand.Read生成安全随机密钥和IV - 密钥建议由用户密码派生:用
golang.org/x/crypto/pbkdf2+ SHA256 + 至少10万次迭代 - IV需随密文一起保存(如前置在密文前),但本身无需保密
使用AES-CBC模式加密文件
CBC模式需填充(PKCS#7),适合一般文件加密,但不提供完整性校验,建议额外计算HMAC或改用GCM。
- 打开源文件读取数据,分块处理避免内存溢出(尤其大文件)
- 对明文末尾执行PKCS#7填充(
cipher.BlockMode不自动填充,需手动) - 将16字节IV写入目标文件开头,再写入加密后的密文
- 示例关键步骤:
block, _ := aes.NewCipher(key); mode := cipher.NewCBCEncrypter(block, iv); mode.CryptBlocks(ciphertext, plaintextPadded)
使用AES-GCM模式加密文件(推荐)
GCM同时提供机密性与完整性,无需单独填充或HMAC,是更现代、更安全的选择。
立即学习“go语言免费学习笔记(深入)”;
- 创建
cipher.AEAD实例:aesgcm, _ := cipher.NewGCM(block) - 生成12字节随机nonce(GCM推荐长度),而非16字节IV
- 调用
aesgcm.Seal()加密:传入nonce、明文、附加数据(可为空),返回含认证标签的密文 - 将nonce(12字节)+ 密文写入文件;解密时先读nonce,再用相同key+nonce调用
Open()
安全读写文件与错误处理
生产环境必须检查每一步的error,且避免明文/密钥残留内存。
实际应用中,优先选AES-256-GCM,配合PBKDF2派生密钥、随机nonce、权限控制与内存清理,即可构建轻量但可靠的数据保护方案。










