跳转到主要内容

什么是哈希

哈希(Hashing)指的是通过一种单向变换将明文数据(如密码)转换为定长字符串的处理方式。 相同输入总能生成相同的哈希,但无法通过哈希还原出原始明文。 Laravel 的 Hash 门面支持 bcryptArgon2 两种哈希算法,用于安全地保存密码。

算法对比

bcrypt 的「工作因子」用于控制生成哈希所需的时间。哈希越慢,抵御暴力破解的能力就越强。随着硬件性能提升,只要相应地增加工作因子即可保持安全等级。

哈希与校验流程


配置

Laravel 默认使用 bcrypt 驱动。可以通过 HASH_DRIVER 环境变量修改。
要自定义哈希配置,可以通过 config:publish 发布配置文件。
发布后可在 config/hashing.php 中修改默认的工作因子等。

基本用法

对密码进行哈希

将密码明文传入 Hash::make() 就会返回哈希值。请将该哈希值保存到数据库。
只将哈希值保存到数据库,绝不要保存明文密码。

调整 bcrypt 的工作因子

通过 rounds 选项可调整生成哈希的计算成本。值越大越安全,但耗时也会增加。 默认值(12)在多数应用场景下都足够。

调整 Argon2 的参数

使用 Argon2 时,可通过 memorytimethreads 选项调整计算成本。
Argon2 参数的详细信息请参阅 PHP 官方文档

校验密码

使用 Hash::check() 可以判断明文密码是否与已保存的哈希匹配。 这是登录处理中最典型的用法。
如果使用 Auth::attempt(),Laravel 会自动进行这一处理,不需要你直接调用。 Hash::check() 适合手动校验当前密码的场合。

是否需要重新哈希

Hash::needsRehash() 可以判断哈希生成时的工作因子是否与当前配置不同。 在调整了工作因子后,可以用它来更新既有哈希。
下面是登录成功时进行重新哈希的例子。
随着硬件性能提升,请定期审查工作因子以保持安全性。利用 needsRehash(),可以在用户登录的自然时机顺便更新密码哈希。

哈希算法校验

默认情况下,Hash::check() 会验证哈希是否由当前配置的算法生成。 如果算法不同则会抛出 RuntimeException 这可以防止篡改哈希算法所带来的攻击。 在需要同时支持多种算法(例如算法迁移期间)时,可以将 HASH_VERIFY 设置为 false 来禁用该校验。
设置 HASH_VERIFY=false 将禁用算法校验。请只在迁移期间使用,迁移完成后请恢复为 true(默认值)。

小结

下一步

认证入门

学习使用 Hash::check() 实现登录处理等,了解认证的整体流程。
最后修改于 2026年7月18日