Go crypto包安全但需正确使用:AES需用AEAD防攻击,密钥等必须用crypto/rand生成,密码哈希应选bcrypt而非SHA256,TLS配置须显式设MinVersion、CurvePreferences和CipherSuites。
Go标准库的包是安全的,但“安全”不等于“开箱即用就防一切风险”——它提供的是经过严格审计的原语(primitives),不是自动帮你规避所有误用的魔法工具。
为什么
本身安全,但你一写错就可能被绕过?
Go 的
实现基于
硬件加速
(如 AES-NI)且通过了 NIST 测试,但标准库只暴露底层块加密模式(如
),不封装认证加密(AEAD)。这意味着:
直接用
+ 自己拼接 IV 和密文,没有完整性校验,容易遭受填充预言攻击(padding
oracle
)
模式在
中仍存在,但完全不推荐——相同明文块永远生成相同密文块,图像加密后还能看出轮廓
IV 必须随机且不可预测,但标准库不帮你生成;若复用 IV(尤其在
或
中),密文可被异或分析
✅ 正确做法:优先用
接口,例如
,它强制绑定 nonce、密文和认证标签(tag),解密失败时直接返回 error,不会泄露中间状态。
和
混用会出什么问题?
这是最常踩的坑:
是伪随机数生成器(PRNG),种子固定就能复现全部输出;而加密场景(如生成密钥、nonce、salt)必须用密码学安全的随机源。
立即学习
“
go语言免费学习笔记(深入)
”;
用
生成 AES 密钥?密钥空间实际只有 2³² 量级,暴力几秒就破
可能返回
,必须检查错误,不能忽略
Windows 下
读取
,Linux 下读
,行为一致且足够安全
✅ 示例:生成 32
字节
密钥
SHA256 和 bcrypt 该选哪个做密码哈希?
是通用哈希函数,设计目标是抗碰撞、不可逆,但**不适合直接哈希密码**:
Trae win
Trae Windows 官方版本现已全面支持 Win10 和 Win11 系统(64位)。国内开发者可直接访问 Trae 中文官网(trae.cn 或 trae.com.cn),一键下载官方正版 .exe 安装包,享受国内直连的高速稳定体验。安装过程极其简便,双击即可运行,并支持一键无缝导入 VS Code 或 Cursor 的原有主题、快捷键及插件配置。登录支持手机号、微信或稀土掘金账号。内置免费的豆包与 DeepSeek 等顶级大模型,让你开箱即用,轻松开启高效的 AI 智能编程之旅。
下载
计算太快:GPU 一秒可试数十亿次 SHA256,彩虹表+盐值也挡不住弱口令
没有内置 salt 管理、迭代次数控制或内存硬化机制
、
、
才是专为密码设计的 KDF(密钥派生函数)
✅ Go 官方推荐用
(非标准库,但由 Go 团队维护):
注意:
当前是 10,对应约 2¹⁰ 次哈希迭代;生产环境建议根据服务器性能调到 12–14。
HTTPS 服务中
的常见配置陷阱
Go 的
默认启用 TLS 1.2+,但几个关键字段不设默认值,留空就等于放行不安全行为:
不设 → 可能协商到 TLS 1.0(已废弃)
不设 → 使用 Go 默认列表,包含部分弱套件(如带 RC4 或 CBC 的)
不设 → 服务端可能选低效曲线(如
),或不支持现代椭圆曲线(如
)
✅ 生产建议显式配置:
真正难的从来不是调用哪个函数,而是理解每个参数背后放弃的兼容性、接受的性能代价、以及没写进文档的隐含假设。
cryptocrypto/aesAESaes.NewCiphercbc.EncryptECBcrypto/cipherCBCCTRcrypto/cipher.AEADcipher.NewGCMcrypto/randmath/randmath/randmath/rand.Int()crypto/rand.Read(buf)io.ErrUnexpectedEOFcrypto/rand\.DeviceCryptoRandom/dev/urandomkey := make([]byte, 32)
if _, err := rand.Read(key); err != nil {
log.Fatal(err) // 不要忽略
}crypto/sha256bcryptscryptargon2golang.org/x/crypto/bcrypthash, _ := bcrypt.GenerateFromPassword([]byte("mypass"), bcrypt.DefaultCost)
// 验证时用 bcrypt.CompareHashAndPassword(hash, []byte("mypass"))DefaultCostcrypto/tlstls.ConfigMinVersionCipherSuitesCurvePreferencesCurveP224X25519config := &tls.Config{
MinVersion: tls.VersionTLS12,
CurvePreferences: []tls.CurveID{tls.X25519, tls.CurveP256},
CipherSuites: []uint16{
tls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
// 排除所有 CBC 和 SHA1 套件
},
}