跳到内容

NotCompromisedPassword

编辑此页

验证给定的密码是否已泄露,通过检查它是否未包含在 haveibeenpwned.com 跟踪的任何公开数据泄露中。

基本用法

以下约束确保 User 类的 rawPassword 属性不存储已泄露的密码

1
2
3
4
5
6
7
8
9
10
// src/Entity/User.php
namespace App\Entity;

use Symfony\Component\Validator\Constraints as Assert;

class User
{
    #[Assert\NotCompromisedPassword]
    protected string $rawPassword;
}

为了进行密码验证,此约束不会将原始密码值发送到 haveibeenpwned.com API。相反,它遵循一个称为 k-匿名密码验证 的安全过程。

实际上,原始密码使用 SHA-1 哈希算法进行哈希处理,并且仅发送哈希的前几个字节。然后,haveibeenpwned.com API 将这些字节与所有泄露密码的 SHA-1 哈希值进行比较,并返回以相同字节开头的哈希列表。这就是约束如何在不完全泄露密码的情况下检查密码是否已被泄露的方式。

例如,如果密码是 test,则整个 SHA-1 哈希值为 a94a8fe5ccb19ba61c4c0873d391e987982fbbd3,但验证器仅将 a94a8 发送到 haveibeenpwned.com API。

参见

在 Symfony 应用程序内部使用此约束时,请定义 not_compromised_password 选项,以避免在 devtest 环境中发出 HTTP 请求。

可用选项

groups

类型: array | string 默认值: null

它定义了此约束的验证组。阅读更多关于 验证组 的信息。

message

类型: string 默认值: 此密码已在数据泄露事件中泄露,不得使用。请使用其他密码。

当密码已泄露时提供的默认消息。

payload

类型: mixed 默认值: null

此选项可用于将任意特定于域的数据附加到约束。配置的 payload 不会被 Validator 组件使用,但其处理完全取决于你。

例如,你可能想要使用 多个错误级别,以便根据错误严重性在前端以不同方式呈现失败的约束。

skipOnError

类型: boolean 默认值: false

当由于任何原因导致对 haveibeenpwned.com API 的 HTTP 请求失败时,将抛出异常(不显示验证错误)。将此选项设置为 true 以不抛出异常并将密码视为有效。

threshold

类型: integer 默认值: 1

此值定义了密码应公开泄露多少次才被视为已泄露。在将此选项设置为更高的值之前,请仔细考虑,因为它可能会降低应用程序的安全性。

这项工作,包括代码示例,根据 Creative Commons BY-SA 3.0 许可获得许可。
目录
    版本