什么是哈希
哈希(Hashing)指的是通过一种单向变换将明文数据(如密码)转换为定长字符串的处理方式。 相同输入总能生成相同的哈希,但无法通过哈希还原出原始明文。 Laravel 的Hash 门面支持 bcrypt 和 Argon2 两种哈希算法,用于安全地保存密码。
算法对比
bcrypt 的「工作因子」用于控制生成哈希所需的时间。哈希越慢,抵御暴力破解的能力就越强。随着硬件性能提升,只要相应地增加工作因子即可保持安全等级。
哈希与校验流程
配置
Laravel 默认使用bcrypt 驱动。可以通过 HASH_DRIVER 环境变量修改。
config:publish 发布配置文件。
config/hashing.php 中修改默认的工作因子等。
基本用法
对密码进行哈希
将密码明文传入Hash::make() 就会返回哈希值。请将该哈希值保存到数据库。
调整 bcrypt 的工作因子
通过rounds 选项可调整生成哈希的计算成本。值越大越安全,但耗时也会增加。
默认值(12)在多数应用场景下都足够。
调整 Argon2 的参数
使用 Argon2 时,可通过memory、time、threads 选项调整计算成本。
校验密码
使用Hash::check() 可以判断明文密码是否与已保存的哈希匹配。
这是登录处理中最典型的用法。
Auth::attempt(),Laravel 会自动进行这一处理,不需要你直接调用。
Hash::check() 适合手动校验当前密码的场合。
是否需要重新哈希
Hash::needsRehash() 可以判断哈希生成时的工作因子是否与当前配置不同。
在调整了工作因子后,可以用它来更新既有哈希。
哈希算法校验
默认情况下,Hash::check() 会验证哈希是否由当前配置的算法生成。
如果算法不同则会抛出 RuntimeException。
这可以防止篡改哈希算法所带来的攻击。
在需要同时支持多种算法(例如算法迁移期间)时,可以将 HASH_VERIFY 设置为 false 来禁用该校验。
小结
下一步
认证入门
学习使用
Hash::check() 实现登录处理等,了解认证的整体流程。