电话
400 9058 355
AES-GCM是Go中文件加密最稳妥的选择,因其兼具机密性与完整性且通过FIPS验证;需用12字节唯一nonce、安全随机密钥、流式加解密,并配合salt与PBKDF2派生密钥。
aes.GCM 做文件加密最稳妥Go 标准库的 crypto/aes + crypto/cipher 组合支持 AEAD 模式,aes.GCM 是目前推荐的默认选择:它同时保证机密性与完整性,且 Go 实现已通过 FIPS 验证路径(如启用 crypto/tls 时的行为可作参考)。别用 CBC 或 ECB —— 它们不带认证,解密后无法判断数据是否被篡改,实际等于裸奔。
关键点:
GCM 要求固定长度的 nonce(12 字节最常用),每次加密必须唯一,但不必保密nonce 和密文一起保存,否则无法解密;通常前置 12 字节存 nonceos.OpenFile + io.Copy 流式加解密才不爆内存读整个文件进 []byte 再加密,遇到几百 MB 的日志或备份文件就直接 OOM。正确做法是用管道流式处理:开两个 goroutine,一个读明文块、加密、写入目标文件;另一个负责协调错误传递。标准库的 io.Copy 天然适配 cipher.AEAD 封装的 writeCloser。
实操建议:
os.Open 打开源文件,os.Create 创建目标文件(注意权限:0600)block, _ := aes.NewCipher(key),再 aead, _ := cipher.NewGCM(block)
nonce := make([]byte, aead.NonceSize()),rand.Read(nonce)
aead.Seal() 包装写入器,或更简单:用 io.Copy 向 aead.Seal(nil, nonce, plaintext, nil) 的结果写入crypto/rand,别手动生成用 "password" 当密钥、或用 md5("mypassword") 衍生,等同于把锁换成贴纸。真实场景必须用密码学安全的随机源生成密钥,或使用 scrypt.Key / pbkdf2.Key 从口令派生 —— 且必须带 salt 和足够迭代轮数。
常见错误:
math/rand 生成密钥 → 输出可预测,完全不安全示例(派生密钥):
salt := make([]byte, 16) _, _ = rand.Read(salt) // 必须用 crypto/rand key := pbkdf2.Key([]byte("user-pass"), salt, 100000, 32, sha256.New)
crypto/cipher 只返回 invalid ciphertext,没更多信息这是设计使然:为防止旁路攻击,GCM 验证失败一律返回同一个错误,不区分是 nonce 错、密钥错,还是密文损坏。所以你得自己加一层上下文包装,比如在加密时写入文件头(magic bytes + version),解密前先校验;出错时结合文件大小、header 是否存在来缩小排查范围。
典型陷阱:
os.O_RDONLY,误开了写权限导致文件被截断真正难调试的,永远不是算法调用本身,而是密钥、nonce、salt、文件边界这四样东西里有一个没对齐。
邮箱:8955556@qq.com
Q Q:8955556
本文详解如何将Go官方present工具(用于生成HTML5...
PySNMP在不同版本中对SNMP错误状态(errorSta...
time.Sleep仅阻塞当前goroutine,其他gor...
PHPfopen()创建含特殊符号的文件名失败主因是操作系统...
WooCommerce中通过代码为分组产品动态聚合子商品的属...
io.ReadFull返回io.ErrUnexpectedE...
本文详解Yii2中控制器向视图传递ActiveRecord数...
本文详解为何通过wp_set_object_terms()为...
Pytest中使用@mock.patch类装饰器会导致补丁泄...
带缓冲的channel是并发安全的FIFO队列;make(c...