安全存储密码
使用 password_hash 对密码进行哈希,并使用 password_verify 验证。
安全存储密码 是 CoddyKit 上的免费 PHP Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 PHP Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 PHP Academy 课程共包含 4 节课。
绝不要存储明文密码
以明文存储密码意味着数据库泄露会暴露每个用户的密码。请始终存储加密哈希,最好使用 bcrypt、Argon2id 或 scrypt。
password_hash()
PHP 内置的 password_hash() 会创建安全哈希,并将随机盐包含在输出中。
<?php
$hash = password_hash("mysecretpassword", PASSWORD_BCRYPT);
// Output: $2y$10$... (includes algorithm, cost, salt, hash)password_verify()
根据存储的哈希验证明文密码。
<?php
$hash = "$2y$10$abcdef...";
$valid = password_verify("mysecretpassword", $hash);
if ($valid) {
echo "Correct password!";
}算法选项
PHP 支持:
PASSWORD_BCRYPT—— 广泛支持,限制为 72 字节PASSWORD_ARGON2I—— 具有内存消耗特性(PHP 7.2+)PASSWORD_ARGON2ID—— 推荐使用,可抵御 GPU 攻击(PHP 7.3+)PASSWORD_DEFAULT—— 当前为 bcrypt,未来的 PHP 版本可能会更改
成本因子
成本因子控制哈希计算的耗时。成本越高,暴力破解攻击就越慢。bcrypt 的默认成本为 10。
<?php
$hash = password_hash("secret", PASSWORD_BCRYPT, ["cost" => 12]);
// Cost 12 takes ~0.5s on typical hardware — acceptable for loginpassword_needs_rehash()
升级 PHP 或更改成本设置后,请检查现有哈希是否需要升级。
<?php
if (password_verify($plain, $storedHash) &&
password_needs_rehash($storedHash, PASSWORD_DEFAULT)) {
$user->update(["password" => password_hash($plain, PASSWORD_DEFAULT)]);
}Laravel 的 Hash 门面
Laravel 在 Hash 门面中封装了 password_hash,默认使用 bcrypt。
<?php
use Illuminate\Support\Facades\Hash;
$hash = Hash::make("mysecretpassword");
$valid = Hash::check("mysecretpassword", $hash); // trueLaravel 中的 Argon2
在 config/hashing.php 中配置 Laravel 使用 Argon2id。
// config/hashing.php
"driver" => "argon2id",盐的处理
现代 PHP 哈希函数会自动包含密码学安全的随机盐。绝不要自行实现加盐,因为很容易出错。
密码椒盐(应用级机密)
可以在哈希之前混入一个存储在数据库之外的可选附加机密(椒盐)。即使数据库被窃取,攻击者没有该椒盐也无法进行暴力破解。
抗时序攻击比较
password_verify() 在内部使用恒定时间比较,从而防止时序攻击。绝不要使用 == 比较哈希。
摘要
使用带有 PASSWORD_DEFAULT 或 PASSWORD_ARGON2ID 的 password_hash()。使用 password_verify() 进行验证。如有需要,请在登录时重新生成哈希。绝不要存储明文密码,也不要使用 MD5/SHA1 存储密码。
快速检查
哪个函数可以根据 PHP 生成的哈希验证密码?
常见问题解答
「安全存储密码」课时是免费的吗?
是的 — 「安全存储密码」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 PHP Academy 课程的其余内容,请升级到 CoddyKit PRO。 PHP Academy 课程共包含 4 节课。
「安全存储密码」这节课中我会学到什么?
使用 password_hash 对密码进行哈希,并使用 password_verify 验证。 你通过在浏览器中直接运行的动手代码来练习 PHP Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 PHP Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 PHP Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「安全存储密码」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 PHP Academy 课中编写并运行代码吗?
能。每节 PHP Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。