PHP密码哈希用哪个函数

wen PHP项目 2

本文目录导读:

PHP密码哈希用哪个函数

  1. 核心函数(推荐)
  2. 完整示例
  3. 常量选项说明
  4. 为什么不用 md5 或 sha1?
  5. 高级技巧:自定义成本(cost)
  6. 密码是否需要重新哈希?

在 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()(旧式)用于密码存储
  • 自定义加密算法
  • 明文存储密码

抱歉,评论功能暂时关闭!