php密码存储必须使用 password_hash() 而不是 md5(),因为 md5() 是单向且无盐的哈希算法,极易被彩虹表破解和碰撞攻击,而 password_hash() 默认使用 bcrypt 算法并自动为每个用户生成唯一的随机盐值,同时具备抗暴力破解的自适应计算成本。

md5() 为什么不安全
md5() 生成的哈希值是确定性的,相同的输入永远产生相同的输出。这意味着如果两个用户密码相同,他们的哈希值也相同,攻击者可以通过查询预先计算的彩虹表直接反推密码,或者通过字典攻击快速尝试常见密码组合。

echo md5('123456');
// 输出: e10adc3949ba59abbe56e057f20f883e
// 无论谁用 '123456',结果都一样
在 md5() 模式下,系统无法区分不同用户的相同密码,也无法抵御大规模并行计算攻击。开发者若仅对 md5() 加固定盐(如 md5($password . 'salt')),虽然增加了部分难度,但盐值对所有用户一致,依然面临彩虹表威胁,且未解决算法本身速度过快的问题。
password_hash() 如何工作
password_hash() 函数在调用时会自动生成一个随机的盐值,并将其与哈希结果一起编码返回。它默认使用 bcrypt 算法,该算法引入了“工作因子”(cost factor),使得哈希计算变得缓慢且资源密集,从而有效延缓暴力破解速度。
SEO关键词密度优化与页面审计技能。使用场景:①提供页面路径与关键词进行SEO优化;②提升页面关键词密度;③提升搜索引擎排名;④进行SEO审计(meta标签、OG、hreflang等)。触发词:关键词密度、SEO优化、关键词优化等。

$hash = password_hash('123456', PASSWORD_DEFAULT);
echo $hash;
// 输出类似: $2y$10$...随机盐...哈希值...
// 再次调用 password_hash('123456', PASSWORD_DEFAULT)
// 会得到完全不同的字符串,因为盐值不同
验证时使用 password_verify(),它会从存储的哈希中提取盐值和成本参数,重新计算并比对。即使攻击者获取了数据库,由于每个用户的哈希都包含唯一盐值且计算成本高,批量破解变得不切实际。
password_needs_rehash() 的作用
随着硬件性能提升,默认的 bcrypt 成本因子可能不再足够安全。password_needs_rehash() 用于检测当前存储的哈希是否仍符合指定的算法或参数要求。当检测到需要升级时,系统在用户下次登录时可重新生成更安全的哈希。
$hash = '$2y$10$...'; // 旧哈希
if (password_needs_rehash($hash, PASSWORD_DEFAULT)) {
$newHash = password_hash('123456', PASSWORD_DEFAULT);
// 更新数据库中的 $newHash
}
这一机制确保了密码存储策略能随时间推移保持安全性,无需手动迁移所有用户数据,只需在验证环节按需升级即可。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










