
PASSWORD_DEFAULT 并非固定算法,而是 PHP 的动态常量,当前(PHP 5.5.0 起)默认指向 bcrypt,未来可能自动升级为更安全的算法(如 argon2),确保密码哈希长期具备安全性与向后兼容性。
`password_default` 并非固定算法,而是 php 的动态常量,当前(php 5.5.0 起)默认指向 `bcrypt`,未来可能自动升级为更安全的算法(如 `argon2`),确保密码哈希长期具备安全性与向后兼容性。
在 PHP 密码安全实践中,PASSWORD_DEFAULT 是一个策略性常量,而非具体算法名称(如 md5 或 sha512)。它不表示某个硬编码的哈希函数,而是由 PHP 内核根据当前版本的安全推荐,动态映射到最合适的密码哈希算法。自 PHP 5.5.0 引入 password_hash() 函数以来,PASSWORD_DEFAULT 一直默认使用 bcrypt(即 PASSWORD_BCRYPT),其哈希字符串格式为 y$...(或 a$/b$,取决于 PHP 版本),具有盐值内嵌、可调成本因子(默认 cost=10)等关键安全特性。
值得注意的是:
✅ PASSWORD_DEFAULT 的底层算法可能随 PHP 主版本升级而变更(例如 PHP 7.4+ 已支持 argon2id,但尚未设为默认;PHP 8.4+ 可能切换)。
✅ 所有通过 password_hash($pass, PASSWORD_DEFAULT) 生成的哈希均自描述——哈希字符串开头明确标识所用算法(如 $2y$ 表示 bcrypt,$argon2id$ 表示 Argon2),因此 password_verify() 可自动识别并正确验证,无需开发者干预。
✅ 为实现平滑升级,PHP 提供 password_needs_rehash() 函数:登录成功后,可检测当前哈希是否基于已过时或非默认算法,若需更新,则用用户本次提交的明文密码重新哈希并持久化:
// 用户登录流程示例
if (password_verify($inputPassword, $storedHash)) {
// 验证成功
if (password_needs_rehash($storedHash, PASSWORD_DEFAULT)) {
$newHash = password_hash($inputPassword, PASSWORD_DEFAULT);
// 将 $newHash 保存至数据库,替换旧哈希
updateUserPasswordHash($userId, $newHash);
}
}⚠️ 重要提醒:
- 切勿将 PASSWORD_DEFAULT 用于需要长期稳定哈希格式的场景(如跨系统迁移、第三方集成),此时应显式指定 PASSWORD_BCRYPT 或 PASSWORD_ARGON2I 等具名常量;
- PASSWORD_DEFAULT 的设计哲学是“面向未来”——它让应用无需修改代码即可受益于 PHP 官方推荐的最新安全实践,是现代 PHP 密码存储的标准首选;
- 在考试中,若问及当前默认算法,答案应为 bcrypt(或 PASSWORD_BCRYPT),同时需强调其可变性与自适应特性,而非视作静态技术名词。



















