bakerkretzmar/laravel-pwned-password-rule

此包已被废弃,不再维护。未建议替代包。

Laravel 验证规则,用于检查密码是否在 Have I Been Pwned 数据库中。

1.0.0 2020-09-06 00:18 UTC

This package is auto-updated.

Last update: 2023-10-06 07:34:35 UTC


README

Latest Version on Packagist Total Downloads Build Status License: MIT

验证密码是否与 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