self::BCRYPT_COST
]);
if ($hash === false) {
throw new RuntimeException('密码哈希生成失败');
}
return $hash;
}
/**
* 校验密码是否正确
* @param string $plainPassword 用户输入的明文密码
* @param string $storedHash 数据库中存储的哈希串
* @return bool
*/
public static function verify(string $plainPassword, string $storedHash): bool
{
return password_verify($plainPassword, $storedHash);
}
/**
* 登录场景示例:支持旧哈希自动升级
* @param string $inputPassword 用户输入的密码
* @param string $dbHash 数据库存储的哈希
* @return bool 校验是否通过
*/
public static function login(string $inputPassword, string $dbHash): bool
{
// 先校验当前密码是否正确
if (self::verify($inputPassword, $dbHash)) {
// 如果是旧算法哈希(比如MD5、SHA256),自动升级为新算法
if (self::isLegacyHash($dbHash)) {
$newHash = self::hash($inputPassword);
// 这里执行数据库更新操作,将$newHash更新到用户密码字段
// UserModel::updatePassword($userId, $newHash);
}
return true;
}
return false;
}
/**
* 判断是否为旧版哈希(根据存储的哈希长度/特征判断,示例以MD5为例)
* @param string $hash
* @return bool
*/
private static function isLegacyHash(string $hash): bool
{
// MD5哈希固定32位,SHA256固定64位,可根据实际旧规则调整
return strlen($hash) === 32 || strlen($hash) === 64;
}
}
// 使用示例
try {
// 1. 用户注册时生成哈希
$userPassword = 'MySecureP@ssw0rd123';
$passwordHash = PasswordService::hash($userPassword);
echo "注册生成的哈希:{$passwordHash}\n";
// 2. 用户登录时校验
$inputPwd = $_POST['password'] ?? '';
$dbStoredHash = $passwordHash; // 实际场景从数据库取
if (PasswordService::login($inputPwd, $dbStoredHash)) {
echo "登录成功";
} else {
echo "密码错误";
}
} catch (Exception $e) {
echo "错误:{$e->getMessage()}";
}
?>
然后是总结与建议,也要检查清单形式,生产环境落地必做:1. 【立即停用如需更完整的 PHP 代码保护与在线加密服务,可访问 https://article.vvxyz.com 了解更多。