
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 官方文档,自 PHP 5.5.0 引入 password_hash() 函数起,PASSWORD_DEFAULT 即映射为 bcrypt(具体为 CRYPT_BLOWFISH 实现,使用 $2y$ 盐前缀),并持续沿用至今(包括 PHP 8.x 系列)。值得注意的是:该常量的底层算法可能随 PHP 主版本升级而变更——例如,PHP 7.2+ 已支持 PASSWORD_ARGON2I 和 PASSWORD_ARGON2ID,但 PASSWORD_DEFAULT 尚未切换;未来若 argon2 被认定为更优默认方案,PASSWORD_DEFAULT 将悄然指向它,而无需开发者修改代码。
✅ 正确使用方式如下:
// ✅ 注册或修改密码时:始终使用 PASSWORD_DEFAULT
$hash = password_hash('mySecret123', PASSWORD_DEFAULT);
// 示例输出:$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi
// ✅ 登录验证时:使用 password_verify()(自动识别算法)
if (password_verify($inputPassword, $storedHash)) {
// 验证通过
// ✅ 检查是否需重新哈希(例如 PHP 升级后默认算法变更)
if (password_needs_rehash($storedHash, PASSWORD_DEFAULT)) {
$newHash = password_hash($inputPassword, PASSWORD_DEFAULT);
// 将 $newHash 存入数据库,替换旧 hash
}
}⚠️ 关键注意事项:
- 切勿硬编码算法:避免直接使用 PASSWORD_BCRYPT 除非有明确兼容性要求;PASSWORD_DEFAULT 才是面向未来的正确选择。
- 哈希字符串自描述:password_hash() 生成的字符串内含算法标识、成本因子(cost)、盐值和哈希结果(如 $2y$10$... 明确表示 bcrypt,$argon2id$... 表示 Argon2id),password_verify() 可自动解析并匹配对应算法。
- 不可逆且抗暴力:bcrypt 具有可调成本因子(默认 cost=10),能有效抵御 GPU/ASIC 暴力破解;而 PASSWORD_DEFAULT 的演进机制确保系统长期保持密码学前沿防护能力。
总之,PASSWORD_DEFAULT 是 PHP 密码安全体系的核心抽象——它不是某个静态算法的别名,而是一套“自动升级”的安全策略。掌握其动态性与配套函数(password_verify、password_needs_rehash)的协同使用,才是构建健壮认证系统的关键。
立即学习“PHP免费学习笔记(深入)”;



















