注册密码必须用bcrypt哈希后再存库,登录时用comparehashandpassword比对;jwt密钥须从环境变量读取,gorm查询需处理软删除。
注册时密码没加密,直接存明文?
这是最常踩的坑——bcrypt 没调用,或调用方式错。Go 标准库不提供密码哈希,必须用第三方包,推荐 golang.org/x/crypto/bcrypt。
常见错误现象:sql: no rows in result set 登录失败但注册看似成功,实际数据库里密码是明文,比对时自然不匹配。
- 注册流程中,必须在插入数据库前调用
bcrypt.GenerateFromPassword,不是注册后补加 - 哈希成本因子建议用
12(bcrypt.DefaultCost是 10,略低;太高影响并发注册性能) - 别把哈希结果再 base64 或 hex 编码——
bcrypt.GenerateFromPassword返回的是可直接存入数据库的字符串,含算法标识、cost、salt 和 hash
登录验证总返回“密码错误”,但确认密码没错
问题大概率出在比对逻辑:用了 == 直接比较原始密码和数据库字段,而不是用 bcrypt.CompareHashAndPassword。
这个函数会自动解析哈希串里的 salt 并重算,还带恒定时间比较,防时序攻击。手动比对不仅错,还危险。