wuwx / laravel-hashing-md5
Add MD5 hashing driver support for Laravel.
Requires
- php: ^7.3 || ^8.0
- illuminate/contracts: ^5.6|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0|^13.0
- illuminate/support: ^5.6|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0|^13.0
Requires (Dev)
- orchestra/testbench: ^3.6|^4.0|^5.0|^6.22|^7.0|^8.0|^9.2|^10.0|^11.0
- phpunit/phpunit: ^7.0|^8.0|^9.0|^10.0|^11.0|^12.0|^13.0
Suggests
None
Provides
None
Conflicts
None
Replaces
None
README
为 Laravel 框架添加 MD5 哈希驱动支持。
注意: MD5 是一种较弱的哈希算法,不推荐用于新项目的密码存储。此扩展包主要用于需要兼容旧系统或特定场景的项目。
功能特性
- 为 Laravel 哈希系统添加 MD5 驱动
- 完全兼容 Laravel 的
HashFacade - 支持 Laravel 5.6 到 13.x 版本
- 支持 PHP 7.3 到 8.x 版本
- 自动服务提供者注册
系统要求
- PHP >= 7.3
- Laravel >= 5.6
安装
通过 Composer 安装扩展包:
composer require wuwx/laravel-hashing-md5
Laravel 5.5+ 会自动注册服务提供者。
配置
编辑 config/hashing.php 配置文件,将 driver 更改为 md5:
'driver' => 'md5',
或者在 .env 文件中设置:
HASH_DRIVER=md5
使用方法
基本使用
配置完成后,可以像使用 Laravel 默认哈希驱动一样使用 MD5:
use Illuminate\Support\Facades\Hash; // 生成 MD5 哈希 $hashed = Hash::make('password'); // 验证密码 if (Hash::check('password', $hashed)) { // 密码匹配 }
指定驱动使用
也可以显式指定使用 MD5 驱动:
$hashed = Hash::driver('md5')->make('password'); $isValid = Hash::driver('md5')->check('password', $hashed);
测试
运行测试套件:
composer test
生成测试覆盖率报告:
composer test-coverage
安全提示
MD5 算法存在以下安全问题:
- 容易受到彩虹表攻击
- 计算速度快,容易被暴力破解
- 存在哈希碰撞漏洞
强烈建议:
- 新项目使用
bcrypt或argon2算法 - 仅在需要兼容旧系统时使用此扩展包
- 考虑逐步迁移到更安全的哈希算法
关于密码自动升级(rehashOnLogin)
needsRehash() 恒返回 false:MD5 没有可调参数(如 bcrypt 的 cost),格式正确即无需重算。这意味着 Laravel 内置的登录时自动重新哈希机制(rehashOnLogin)在本驱动下不会生效——即使用户表中的密码不是本驱动生成的格式,也不会在登录时被自动升级或转换。
hashed cast 的已知限制
Laravel 11 及以上:hashed cast 正常工作,Hash::isHashed() 会通过本驱动的 info() 识别 MD5 哈希,已哈希的值不会被二次哈希。
Laravel 10.35–10.48:框架的 HashManager::isHashed() 硬编码使用 password_get_info(),不调用自定义驱动的 info(),因此对本驱动生成的 MD5 哈希一律返回 false——hashed cast 会把已哈希的值再哈希一层。这是框架限制,无法在驱动层修复。在 Laravel 10 上请勿对密码字段使用 hashed cast,改为显式赋值:$user->password = Hash::make($pwd)。
32 位十六进制明文:Hash::isHashed() 通过 /^[0-9a-f]{32}$/i 格式识别 MD5 哈希。若明文密码本身恰好是 32 位十六进制字符串(例如 1234567890abcdef1234567890abcdef),会被误判为已哈希而原样入库。若你的密码策略允许这类值,同样请勿使用 hashed cast。
以上问题仅影响 isHashed() / hashed cast 链路,不影响登录校验(check() 不依赖 info())。
许可证
本项目基于 MIT 许可证 开源。
贡献
欢迎提交 Issue 和 Pull Request。