用户换绑手机号后登录提示密码错误,用旧密码也登不进去,库里 password_hash 是用手机号当盐算的,换号时只更新了 phone 没有重算哈希。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
SELECT id, length(password_hash), password_salt FROM users LIMIT 5; htpasswd -bnBC 12 demo old-password | cut -c1-40
盐和业务字段绑在一起,字段一变哈希就失效。盐的设计应该是每个用户独立随机、与业务数据无关、和哈希一起存。换号流程没有考虑派生数据。这一点先确认清楚,后面就不用反复试。
碰到「哈希盐值固定」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。
改完隔一天再看一次,当场正常不代表能稳住。
具体做法是,改用随机盐 每个用户 16 字节 存在 password_salt 列;哈希算法换成 bcrypt 自带盐 不再单独维护 salt;换号流程不再触碰密码哈希;用一个测试账号换号后重新登录验证。
改完照着核一遍,换号后原密码仍能登录 新注册用户的 salt 两两不同。
