Buffalo框架不内置密码加密功能,需手动集成bcrypt等哈希库;自动生成的auth代码不包含加密逻辑,必须在BeforeCreate中调用bcrypt.GenerateFromPassword,并用CompareHashAndPassword校验。

Buffalo 框架本身不提供密码加密功能——它是一个 Go 语言的 Web 应用框架(类似 Rails),核心关注路由、模板、中间件等,bcrypt、scrypt 或 argon2 这类密码哈希逻辑需自行集成标准库或第三方包。
Buffalo 框架里没有内置 password_hash 函数
很多人在初次使用 Buffalo 时会误以为 buffalo generate auth 自动生成的用户模型已包含加密逻辑,其实它只生成了基础结构和数据库迁移,并未调用任何哈希函数。密码字段默认仍是明文写入 password 字段,必须手动干预。
- 生成的
User.Create方法不会自动加密Password字段 -
auth.NewAuther()中的登录校验也仅做字符串比对(若未改写) - 官方模板中缺失
golang.org/x/crypto/bcrypt的 import 和HashPassword调用
必须手动集成 bcrypt.GenerateFromPassword
Go 标准生态推荐使用 golang.org/x/crypto/bcrypt,它抗彩虹表、自带盐值、可调代价因子(cost),是目前最稳妥的选择。不要用 md5 或 sha256 等快速哈希——它们根本不适合密码存储。
Buffalo框架 1.0.1 版本源码包下载,适合需要错误处理改进、依赖更新、render.Download 注释和 request logger 调整的 v1 项目。
- 在
models/user.go的BeforeCreate回调中插入哈希逻辑:func (u *User) BeforeCreate(tx *pop.Connection) error { if u.Password != "" { hash, err := bcrypt.GenerateFromPassword([]byte(u.Password), bcrypt.DefaultCost) if err != nil { return errors.WithStack(err) } u.Password = string(hash) } return nil } - 登录时用
bcrypt.CompareHashAndPassword校验,而非== - 确保数据库中
password字段长度 ≥ 60(bcrypt输出通常为 60 字符)
别把 Buffalo 的 Auth 插件当黑盒用
buffalo-auth 插件(如 github.com/gobuffalo/auth)只是封装了部分流程,但它不强制你加密,也不拦截原始密码。它的 Auther.Login 方法接收原始密码后,仍需你显式调用哈希比对——插件只帮你做了 session 设置和重定向,底层验证逻辑仍由你控制。
- 检查你实际调用的
Login实现:是否用了bcrypt.CompareHashAndPassword? - 若用了
github.com/gobuffalo/pop/v6查询用户,确认查出的是哈希后的password字段值,而非明文缓存 - 测试时故意输错密码,观察日志是否报
crypto/bcrypt: hashedPassword is not the hash of the given password——这是正确触发校验的标志
真正容易被忽略的点是:Buffalo 的 model hook(如 BeforeCreate)在事务内执行,但如果你在 controller 层提前对 user.Password 做了赋值又没触发 hook(比如绕过 tx.Create() 直接 SQL 插入),哈希就彻底失效了。务必让所有用户创建路径都经过 pop 的生命周期方法。

















