推荐使用AES-GCM加密模式,结合PBKDF2派生密钥、随机salt与nonce,按salt(16)+nonce(12)+ciphertext+tag格式封装文件,流式处理大文件并严格校验错误。

用 Golang 实现一个轻量、安全、易用的文件加密解密工具并不难,关键是选对算法、管好密钥、处理好 I/O 和错误。推荐使用 AES-GCM(带认证的对称加密),它同时提供机密性与完整性,且 Go 标准库 crypto/aes 和 crypto/cipher 原生支持。
选择 AES-GCM 加密模式
AES-GCM 是目前主流推荐的加密方式:速度快、抗篡改、无需额外 HMAC 计算。Go 中通过 cipher.NewGCM 构建加解密器,注意必须使用唯一且不可预测的 nonce(通常随机生成 12 字节)。
- 密钥长度建议 32 字节(AES-256),可通过 PBKDF2 或 scrypt 从用户密码派生
- nonce 每次加密都应不同,需和密文一起保存(如前置在文件开头)
- GCM 输出包含密文 + 认证标签(tag),解密时自动校验,失败直接报错
安全派生密钥:避免明文密码直用
不要把用户输入的密码直接当 AES 密钥。用 golang.org/x/crypto/pbkdf2 或 scrypt 增加暴力破解成本:
- 盐值(salt)必须随机生成(16 字节),和加密文件一起存储(如前 16 字节)
- 迭代次数建议 ≥ 100,000(PBKDF2)或 N=65536(scrypt),平衡安全与性能
- 示例:用 PBKDF2 从密码+salt 得到 32 字节密钥:
pbkdf2.Key([]byte(password), salt, 100000, 32, sha256.New)
文件加解密流程设计
加密时:读取原文 → 生成 salt + nonce → 派生密钥 → AES-GCM 加密 → 拼接 salt|nonce|ciphertext|tag 写入新文件。
解密时:读取前段提取 salt/nonce → 派生密钥 → GCM 解密 → 校验 tag → 写出明文。
立即学习“go语言免费学习笔记(深入)”;
- 推荐文件格式:[salt(16)][nonce(12)][ciphertext+tag],固定头部便于解析
- 大文件用流式处理(
io.Pipe或分块读写),避免内存爆炸 - 务必检查所有
error,尤其解密失败时返回明确提示(如“密钥错误或文件损坏”)
命令行交互与基础防护
用 flag 或 spf13/cobra 实现简单 CLI,例如:tool encrypt -in config.json -out config.enc -pass "mypassword"。










