Laravel密码加密必须用Hash::make()生成带盐哈希值,验证时唯一安全方式是Hash::check(),二者成对使用以支持算法升级;禁用md5、sha256等快哈希及直接字符串比较。

别纠结用 bcrypt 还是 argon2,Laravel 默认的 Hash::make() 已经选对了——它在 PHP 环境支持的前提下自动择优,你只需确保配置合理、验证方式正确,其他交给框架。
为什么不能用 hash() 或 md5() 存密码
这些函数输出固定、无盐、计算极快,攻击者用 GPU 一秒钟能跑几亿次。哪怕加了自己拼的盐(比如 hash('sha256', $password . $salt)),也不等价于 bcrypt/argon2 的慢哈希设计,更绕过了 PHP 密码哈希 API 的安全加固机制。
常见错误现象:
- 数据库里存着
5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8这类 64 字符 sha256 值——这等于把密码裸奔上传 - 用户反馈“相同密码登录有时成功有时失败”,其实是误用了
==直接比对哈希字符串
Hash::make() 和 Hash::check() 必须成对使用
二者不是独立工具,而是一套闭环:前者生成带元信息(算法、cost、salt)的完整哈希串,后者自动解析并复现哈希过程。手动混用 password_hash() / password_verify() 会丢失 Laravel 的驱动抽象能力,未来升级算法时验证直接失效。
Word报告自动生成神器。自动生成专业Word文档报告,支持模板填充、目录生成、表格/图表插入、页眉页脚、多级标题、样式主题、批量邮件合并。当用户需要生成Word报告、创建合同文档、批量生成通知/证书、填充Word模板、制作商业计划书时触发。
关键点:
-
Hash::make('abc')每次返回不同字符串(如$2y$12$...和$2y$12$...),这是正常且必须的 - 验证必须写
Hash::check($input, $user->password),绝不能写$input === $user->password或strcmp() - 如果数据库字段是旧系统迁移来的 md5 值,
Hash::check()会安静地返回false,不会报错——得靠Hash::needsRehash()主动识别并升级
怎么安全地切换哈希算法或调高强度
直接改 config/hashing.php 不会让老用户自动重哈希。真正生效要靠登录时的“懒升级”逻辑:
- 确保
Hash::needsRehash($user->password)在登录流程中被调用(Laravel 8.17+ 才可靠) - 若返回
true,说明当前哈希强度低于配置值(比如数据库里还是 cost=10 的 bcrypt,而 config 设了 12),此时应重新Hash::make($request->password)并保存 - 字段长度必须设为
VARCHAR(255):bcrypt 固定 60 字符,argon2id 默认 97 字符,留足余量防 future-proof 失败 - 升 cost 到 14 后单次哈希可能超 400ms,在登录接口 QPS 高时易堆积延迟,建议压测后再上线
最易被忽略的一点:所有密码操作只应在控制器或 Request 层发生一次明文接触;模型 mutator 里调 Hash::make() 是反模式,既破坏职责分离,又容易在 Eloquent 生命周期中意外多次哈希。


















