0Pricing
PHP Academy · 课时

安全存储密码

使用 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 login

password_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); // true

Laravel 中的 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 跨站脚本攻击(XSS)防护
  2. SQL 注入与参数化查询
  3. CSRF 防护
  4. 安全存储密码
← 返回 PHP Academy