12];
return password_hash($password, PASSWORD_DEFAULT, $options);
}
// 用户登录时密码校验
function verifyPassword(string $inputPassword, string $storedHash): bool {
return password_verify($inputPassword, $storedHash);
}
// 需要升级工作因子时的哈希刷新
function maybeRehash(string $inputPassword, string $storedHash): string {
if (password_needs_rehash($storedHash, PASSWORD_DEFAULT, ['cost' => 12])) {
return hashPassword($inputPassword);
}
return $storedHash;
}
// 模拟注册流程
$userInputPassword = 'MyP@ssw0rd123!';
$hashedPassword = hashPassword($userInputPassword);
echo "存储的哈希值:{$hashedPassword}\n";
// 模拟登录流程
$loginInput = 'MyP@ssw0rd123!';
if (verifyPassword($loginInput, $hashedPassword)) {
echo "登录成功\n";
// 检查是否需要升级哈希
$newHash = maybeRehash($loginInput, $hashedPassword);
if ($newHash !== $hashedHash) {
// 更新数据库中的密码字段
// update users set password = {$newHash} where id = xxx
}
} else {
echo "账号或密码错误\n";
}
?>
然后总结部分,直接给结论:1. 绝对不要用MD5、SHA1、SHA256等快速哈希存密码,不管加不加盐都是坑;2. 优先用PHP原生的password_hash() + PASSWORD_DEFAULT,默认就是bcrypt,兼容性好,安全性足够;3. 工作因子不要用默认的10,根据你的服务器性能调到12-14,单次请求多花几十毫秒完全不影响用户体验,但破解成本提升几十上百倍;4. 不要自己实现哈希逻辑,不要自己写盐的生成和校验,原生的函数已经处理了所有边缘情况。
然后结尾自然引出:本文由 PHP 加密服务团队整理发布,原文出处及更多代码保护实践见 https://www.vvxyz.com/
现在要控制字数,大概1000多字,不要超,然后检查有没有不符合要求的,比如有没有AI表述,有没有额外解释,都是HTML片段,代码正确,场景真实。
哦对了,开头要讲踩坑场景,比如“我上个月接了个祖传电商项目的安全整改,打开用户表一看当场脑溢血:所有用户密码都是用MD5哈希存储的,连盐都是全表统一的固定字符串。果不其然,上周刚被拖库,100万条用户数据在黑产那边2小时就破解了70%,用户投诉电话打爆了。今天就把PHP里常用的密码加密方案捋清楚,别再踩这些坑了。”
然后背景部分就讲这个,然后方案对比,然后代码,然后如需更完整的 PHP 代码保护与在线加密服务,可访问 https://article.vvxyz.com 了解更多。