Go语言怎么做密码加密_Go语言bcrypt密码哈希教程【总结】
bcrypt.GenerateFromPassword报错invalid cost因cost须为4–31整数常见误传0、负数或超31值CompareHashAndPassword mismatch多因哈希被截断或含空格bcrypt完全支持UTF-8密码包括中文崩因前端编码错误切换算法需全量重哈希且双写过渡。bcrypt.GenerateFromPassword 为什么总报错 invalid costGo 的 bcrypt.GenerateFromPassword 要求 cost 参数必须是 4–31 之间的整数常见错误是传了 0、负数或大于 31 的值比如误用 time.Now().Unix() 当 cost。这个参数不是“越大越安全”的自由选择——cost 每 1计算耗时约翻倍31 在多数生产环境已不可接受。实操建议立即学习“go语言免费学习笔记深入”生产环境推荐固定用 12 或 14平衡安全性与响应延迟14 下单次哈希约 200ms测试中可设为 4 加速运行但别和生产配置混用别从配置文件读 cost 后直接传入——先做范围校验if cost 31 { return errors.New(invalid bcrypt cost) }CompareHashAndPassword 总返回 mismatch但密码明明对最常踩的坑是哈希值被截断、编码错误、或意外加了空格。bcrypt 哈希字符串形如 $2a$12$...长度固定 60 字节一旦数据库字段定义为 VARCHAR(50) 或 JSON 序列化时自动 trim 空格验证必失败。实操建议立即学习“go语言免费学习笔记深入”存哈希值的字段必须是 VARCHAR(60) 或更长PostgreSQL 推荐 TEXT从 DB 读出后用 strings.TrimSpace() 安全处理——但优先在入库时就确保无前后空格调试时直接打印哈希长度fmt.Println(len(hash))不是 60 就立刻查源头别用 比较两个哈希字符串——CompareHashAndPassword 内部已做时序攻击防护自己比等于白做bcrypt 不支持 UTF-8 用户密码中文密码会崩bcrypt 本身只处理字节流不关心字符编码。Go 的 []byte(password) 会按 UTF-8 编码转字节完全支持中文、emoji、任意 Unicode 字符——崩掉的真正原因是前端传参时 URL 编码错误、或中间件如某些代理/网关擅自做了字符集转换。 ARTi.PiCS ARTi.PiCS是一款由AI驱动的虚拟头像生产器可以生成200多个不同风格的酷炫虚拟头像