本文目录导读:

在 PHP 中,密码哈希推荐使用 password_hash() 函数,配合 password_verify() 进行验证。
核心函数(推荐)
// 1. 创建哈希(加密)
$hash = password_hash($password, PASSWORD_DEFAULT);
// 2. 验证密码
if (password_verify($password, $hash)) {
// 密码正确
} else {
// 密码错误
}
完整示例
// 用户注册时
function registerUser($username, $password) {
// 创建哈希(自动包含盐值)
$hashedPassword = password_hash($password, PASSWORD_DEFAULT);
// 将 $hashedPassword 存入数据库
// INSERT INTO users (username, password) VALUES (?, ?)
}
// 用户登录时
function loginUser($username, $password) {
// 从数据库取出 $hashedPassword
$hashedPassword = getUserPassword($username);
if (password_verify($password, $hashedPassword)) {
return true; // 登录成功
} else {
return false; // 登录失败
}
}
常量选项说明
| 常量 | 算法 | 是否推荐 |
|---|---|---|
PASSWORD_DEFAULT |
目前是 bcrypt(PHP 7.4+)或 Argon2id(PHP 8.0+) | ✅ 最推荐(自动适应未来算法) |
PASSWORD_BCRYPT |
bcrypt | ✅ 安全,兼容性好 |
PASSWORD_ARGON2I |
Argon2i | ✅ 更安全,但需 PHP 7.2+ |
PASSWORD_ARGON2ID |
Argon2id | ✅ 最安全,PHP 7.3+ |
注意:
PASSWORD_DEFAULT会随 PHP 升级而自动更新算法,所以推荐始终使用它。
为什么不用 md5 或 sha1?
// ❌ 不安全,已过时 $hash = md5($password); $hash = sha1($password); // ✅ 正确做法 $hash = password_hash($password, PASSWORD_DEFAULT);
原因:
- MD5/SHA1 速度太快,容易被暴力破解
- 没有内置盐值,相同密码产生相同哈希
- 已被广泛破解
高级技巧:自定义成本(cost)
// 自定义 bcrypt 成本(默认 10,范围 4-31)
$options = [
'cost' => 12, // 增加成本会降低速度,但更安全
];
$hash = password_hash($password, PASSWORD_BCRYPT, $options);
密码是否需要重新哈希?
// 检查哈希是否需要升级
if (password_needs_rehash($hash, PASSWORD_DEFAULT)) {
$newHash = password_hash($password, PASSWORD_DEFAULT);
// 更新数据库中的哈希
}
始终使用:
- 哈希:
password_hash() - 验证:
password_verify() - 算法:
PASSWORD_DEFAULT
绝对禁止:
md5(),sha1(),crypt()(旧式)用于密码存储- 自定义加密算法
- 明文存储密码