bakerkretzmar / laravel-pwned-password-rule
Laravel 验证规则,用于检查密码是否在 Have I Been Pwned 数据库中。
Requires
- php: ^7.4
- guzzlehttp/guzzle: ^7.0
- illuminate/http: ^7.0
- illuminate/support: ^7.0
Requires (Dev)
- orchestra/testbench: ^5.0
README
验证密码是否与 Have I Been Pwned 数据库中的密码匹配。
Have I Been Pwned 是一项服务,可让您检查您的任何账户是否在数据泄露中受损。除了网站和账户搜索功能外,他们还运营一个 Pwned Passwords 工具,允许安全且匿名地仅搜索在泄露中发现的 密码。在底层,此验证规则查询 Pwned Passwords API,并检查待验证值在 HIBP 的泄露数据库中出现的 是否 以及 频率。
此包不会与第三方共享您的用户密码。使用此规则进行验证的值会在您的应用程序中进行哈希处理,并将哈希值的前五个字符发送到 Pwned Password API。API 返回所有与这五个字符匹配的密码哈希后缀,然后在您的应用程序中,此规则确定哪个哈希与您发送的值匹配。此包还支持 响应填充 以进一步隐藏 API 对哈希查询的响应。
有关更多信息,请阅读 Pwned Passwords 的发布公告,介绍 3.06 亿可免费下载的 Pwned Passwords,V2 公告,我刚刚推出了“Pwned Passwords”V2,提供 5 亿密码下载,以及 Have I Been Pwned API 文档。
安装
您可以使用 Composer 安装此包
composer require bakerkretzmar/laravel-pwned-password-rule
用法
像使用任何其他 Laravel 验证规则一样使用此规则
use Bakerkretzmar\PwnedPasswordRuled\Pwned; $request->validate([ 'email' => ['required', 'email'], 'password' => ['required', 'confirmed', 'min:12', new Pwned], ]);
您还可以使用规则的字符串别名
$request->validate(['password' => ['required', 'pwned']]);
默认情况下,此规则将失败任何在 Have I Been Pwned 的泄露数据库中 曾经 出现的值,该数据库包含超过 5 亿个密码。为了允许那些已泄露但未在数据库中频繁出现的密码,您可以向规则传递一个整数作为其第一个参数。出现次数这么多或更少的值将通过验证。
// Fails for 'password', passes for 'alpaca999' which appears 3 times $request->validate(['password' => ['required', new Pwned(5)]]); // or $request->validate(['password' => ['required', 'pwned:5']]);
Pwned Passwords 还通过可选的响应填充提供额外的安全性,响应填充会将假哈希填充到 800-1,000 行的长度,以防御检查响应 大小 的攻击,以确定 API 返回了多少匹配项。您可以通过将 true
作为此规则的第二个参数传递来启用响应填充。
// Under the hood, returns at least 800 password hashes regardless of how many matched the query $request->validate(['password' => ['required', new Pwned(0, true)]]); // or $request->validate(['password' => ['required', 'pwned:0,true']]);
安全
如果您在此包中发现任何与安全相关的问题,请通过电子邮件 jacobtbk@gmail.com 联系,而不是提交问题。
致谢
- Troy Hunt 创建并维护 Have I Been Pwned
许可证
此包在 MIT 许可证下发布。请参阅 LICENSE.md。