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 选项,以避免在 dev
和 test
环境中发出 HTTP 请求。
可用选项
payload
类型: mixed
默认值: null
此选项可用于将任意特定于域的数据附加到约束。配置的 payload 不会被 Validator 组件使用,但其处理完全取决于你。
例如,你可能想要使用 多个错误级别,以便根据错误严重性在前端以不同方式呈现失败的约束。
skipOnError
类型: boolean
默认值: false
当由于任何原因导致对 haveibeenpwned.com
API 的 HTTP 请求失败时,将抛出异常(不显示验证错误)。将此选项设置为 true
以不抛出异常并将密码视为有效。