danhunsaker/laravel-topology

一个用于密码拓扑检查的 Laravel 扩展包

v0.1.1 2019-12-26 05:58 UTC

This package is auto-updated.

Last update: 2024-08-26 16:36:07 UTC


README

Liberapay receiving

一个用于 password-topology-check 的 Laravel 扩展包

这是什么?

password-topology-check 扩展包提供了一种将密码转换为其拓扑的简单工具。它还提供了一种将结果与最常用的 100 种拓扑(也称为PathWell 拓扑)进行比较的功能,并拒绝任何匹配的新密码。其目的是通过使密码更难以猜测来减少网站的安全漏洞。

那么密码拓扑是什么?好吧,这要追溯到许多网站用于提高安全的“字符类别”。一般有四种,即:大写字母、小写字母、数字和符号。密码的拓扑就是其字符类别的模式。例如,P@5s 的拓扑是 upper, symbol, digit, lower,或简称为 usdl,而 w0®Dldsu。确保您的用户不重复使用 PathWell 拓扑可以确保黑客需要先通过所有这些,然后才能开始尝试破解。许多人会在到达这一步之前放弃。

当然,这还不够,就像要求所有四个字符类别一样。真正的益处并不在于阻止最常见的,尽管这是一个好的开始。相反,真正的益处来自于我们可以用它做的其他事情。在用户层面,很容易将新旧密码分别转换为它们的拓扑,然后计算它们之间的 Levenshtein 距离。如果拓扑没有以足够高的因素变化(这里的默认值是 2),则密码也没有足够的变化。然后,作为额外的保护层,可以添加“磨损平衡”的概念,以防止用户重复使用其他用户(或他们以前的密码)已经使用的拓扑。通过磨损平衡密码拓扑需要某种类型的第二个数据存储,以防止攻击者获取太多有关哪些拓扑正在使用的详细信息,但可以将密码分布得更广,使其更难以破解,并减少破解一个密码有助于揭示其他几个密码的可能性。

那么,这是什么?

此扩展包将 password-topology-check 扩展包钩到 Laravel 项目中。它注册了两个新的验证规则,您可以使用它们来比较拓扑并实现磨损平衡。配置文件提供了一些选项,用于处理每个功能的方式。除此之外,它尽量不干涉。

使用方法

如果您的 Laravel 版本低于 5.5,您需要手动将服务提供程序添加到您的 config/app.php

    'providers' => [
        // ...
        DanHunsaker\PasswordTopology\TopologyServiceProvider::class,
    ],

除非默认值适合您的应用程序,否则您可能想要发布配置和语言文件

php artisan vendor:publish --provider DanHunsaker\\PasswordTopology\\TopologyServiceProvider

验证:topology

开箱即用,您将获得两个新的验证规则。第一个是 拓扑,有两种使用方式。第一种是检查输入是否与内部禁止的拓扑列表相匹配

$v = Validator::make(
    ['password' => '12345QWERTqwert@'],
    ['password' => 'topology']
);
$v->passes();

内部列表可以在启动时直接修改,也可以在创建/更新密码时自动修改——也就是说,它们也可以进行磨损均衡。有关如何设置此功能的更多详细信息,请参阅下面的配置部分。

验证:拓扑:{列表}

使用 拓扑 规则的第二种方式是将其与硬编码的拓扑列表相匹配

$v = Validator::make(
    ['ssn' => '555-55-5555'],
    ['ssn' => 'topology:dddsddsdddd,ddddddddd']
);
$v->passes();

或者

// Don't allow US phone numbers without area codes
$v = Validator::make(
    ['phone' => '555-555-5555'],
    ['phone' => 'topology:!ddddddd,!dddsdddd']
);
$v->passes();

! 开头的拓扑是禁止的,而裸拓扑是允许的。所以上面的例子将允许 555-55-5555555555555,但不允许 555-555-555;以及 555-555-5555(555) 555-5555,但不允许 555-55555555555。如果显式允许任何拓扑(即,如果列表包括裸拓扑),则只有允许的拓扑将通过验证。

验证:topo-dist:{字段}

第二个新的验证规则是 topo-dist,它检查新密码的拓扑是否至少与旧密码的拓扑配置的 Levenshtein 距离一样远

$v = Validator::make(
    ['current' => 'QWERT12345qwert!', 'password' => '12345QWERTqwert@'],
    ['password' => 'topo-dist:current']
);
$v->passes();

注意:密码重置无法利用此功能,因为无法比较之前的密码。

拓扑使用跟踪

此软件包还提供对审计您的拓扑使用情况以及磨损均衡您的拓扑的支持,但需要一些额外的设置才能使用。第一步是更新您的 ResetPasswordController,使用此软件包的 ResetsPasswords 特性而不是 Laravel 的。虽然这非常简单——只需更改

use Illuminate\Foundation\Auth\ResetsPasswords;

use DanHunsaker\PasswordTopology\ResetsPasswords;

第二步是更新您的 RegisterController,在创建新用户时使用此软件包的 TracksTopologyUsage 特性的 updateTopologyUsage 方法。

use DanHunsaker\PasswordTopology\TracksTopologyUsage;

class RegisterController extends Controller
{
    use RegistersUsers, TracksTopologyUsage;

    // ...

    protected function create(array $data)
    {
        $user = User::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'password' => Hash::make($data['password']),
        ]);

        $this->updateTopologyUsage($data['password']);

        return $user;
    }
}

然后,只需像对待 RegisterController 那样对待您用于 更新 用户的任何/所有控制器,您就可以收集您需要的拓扑使用数据,无论是为了审计还是为了磨损均衡(或者可能是两者?)。

配置

配置文件提供了一些启用和禁用附加功能的选项。以下将描述每个选项及其默认值,以便您可以决定是否发布配置文件。

  • unicode (true)

    设置为 true 时,所有拓扑转换将在 Unicode 模式下进行,完全支持 Unicode 所支持的脚本。强烈建议将其设置为 true,以正确支持可能使用非英语键盘和语言的任何用户。非 Unicode 模式不能正确支持不在英语字符集中的 欧洲 语言字符(即,在 ASCII 字符范围内)。它主要可以设置为 false,以与不支持 Unicode 的应用程序/服务器兼容,或者在应将非 ASCII 字母和数字视为符号的其他旧用例中。

  • min_lev_dist (2)

    配置密码拓扑在更新时必须改变多少。此值由 topo-dist 验证器用于确定两个密码可以有多相似而不会失败检查。默认情况下,需要拓扑改变两次或更多;值为 0 则不需要任何改变。

  • audit_store (null)

    用于跟踪拓扑使用信息的数据库连接。这不应与存储密码的连接相同,因为它为潜在的攻击者提供了有关要针对哪些密码拓扑进行暴力破解的提示。当设置为 null(默认值)时,根本不存储使用数据。

  • max_topo_use (1)

    当在audit_store中提供了有效的数据库连接时,任何使用级别在此或以上的拓扑结构将在启动时自动添加到禁止列表中,防止它们被同一站点的其他密码使用。由于使用数据仅跟踪密码对每个拓扑结构的设置情况,这涵盖了您站点密码的整个历史记录,从创建audit_store的那一刻开始。建议增加此值而不是销毁audit_store数据,因为那样会随着时间的推移提供更好的保障。

    当启用时,试图入侵您站点的某人将只能尝试破解每个拓扑结构的max_topo_use个密码。

    将此值设为0将允许您收集使用数据而不强制实施任何拓扑使用限制,但请记住,您将失去均衡磨损的效果,以及每个拓扑结构的最大破解限制。

  • forbidden / allowed ([] / [])

    分别添加或删除拓扑结构,从启动时的禁止列表中。首先处理allowed拓扑结构,确保forbidden拓扑结构具有优先权。《PathWell Topologies》在启动前已经位于禁止列表中,因此无需在此列出。

    拓扑值使用以下组件

    • u:大写(A-Z,或任何Unicode模式中的大写/标题字母)
    • l:小写(a-z,或任何Unicode模式中不在大写/标题字母中的字母)
    • d:数字(0-9,或任何Unicode数字)
    • s:符号(任何其他字符,在任一模式中)

    有关更多详细信息,请参阅上方的什么是它?