发布于2026-07-20 阅读(0)
扫一扫,手机访问
讲真,直接上password_hash()就行,别再去碰那些老古董了——md5()、sha1()、crypt()这些,PHP官方已经明确表示不推荐了。它们不安全,而且你根本找不到一个站得住脚的理由继续用它们。

md5() 或 sha1() 存密码这些函数设计出来的初衷就是快,而不是扛暴力破解。现代GPU一秒钟能跑上亿次md5(),就算你加了盐,也挡不住彩虹表和暴力破解工具的轮番轰炸。更要命的是:md5("password")永远输出同一个值,攻击者拿到数据库后,完全可以批量反查,一查一个准。
常见的翻车现场有哪些?
md5($_POST['pwd']),登录时再比一下md5($input)——这等于把密码明文“翻译”成了一个固定字符串,毫无防御力可言。md5($pwd . $salt),但盐是固定的,或者用用户名这种可预测的东西——盐一旦失去随机性,就等于没盐。password_hash()输出的长度最长能超过255个字符,字段太小就会被截断,后续的password_verify()必然失败。password_hash() 怎么调用才正确这个函数帮你把盐生成、算法选择、格式封装这些破事儿全包了。你只需要做一件事:把密码传进去,把返回值存下来,验证的时候原样扔给password_verify()就行。
操作要点:
PASSWORD_DEFAULT,别用PASSWORD_BCRYPT。前者会随着PHP版本升级,自动切换到更安全的算法(目前是bcrypt,未来可能是Argon2),省心省力。VARCHAR(255)或更长。bcrypt输出大约60个字符,Argon2能到190个以上,留足余量总没错。password_verify()都会罢工。password_hash("mypass123", PASSWORD_DEFAULT)会返回一串类似$2y$10$9vXJZ.../QzA8w的字符串,直接往数据库里一存就行。password_verify() 验证失败的典型原因验证失败,密码没错?问题可能出在这儿。很多时候不是密码错了,而是存储或比对环节出了偏差。最常见的坑,都集中在数据流转过程中:
PASSWORD_DEFAULT,登录时却用password_hash($input, PASSWORD_BCRYPT)去生成一个比对串——这种做法大错特错。验证必须用password_verify($input, $hash_from_db),不能自己再去哈希一把。trim()、stripslashes()或其他过滤函数处理过。尤其要注意MySQL的SELECT结果,如果字段类型是CHAR且长度不够,会自动右补空格。PHP的==比较可能会忽略末尾空格,但password_verify()是严格校验字节流的,空格会导致失败。password_hash()在PHP 5.5+才原生支持,低版本得额外加载才行)。今天用PASSWORD_DEFAULT存的密码,过几年PHP升级,默认算法可能变成Argon2。这时候用户下次登录,password_verify()仍然能成功验证,但你可以顺手用新算法重哈希一次,再更新到数据库里——这样存量密码也会逐步升级,安全性也跟着水涨船高。
判断是否需要重哈希,方法很简单:password_needs_rehash($hash_from_db, PASSWORD_DEFAULT)返回true,就说明该更新了。这个逻辑容易被忽略,但它是让老系统持续保持安全的关键动作,值得花点时间加上。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8