本页介绍了如何使用 reCAPTCHA 的密码泄露检测功能 检测密码泄露和被盗用的凭据, 从而防止账号被盗 (ATO) 和凭据填充攻击。包含 您可以定期 在任何评估过程中对用户凭据(密码)进行审核,以确保 它们没有泄露或遭到破坏。为了进行这些评估,Google 会使用 密码安全检查功能。
准备工作
Make sure that billing is enabled for your Google Cloud project.
reCAPTCHA 要求在项目上关联并启用结算功能才能使用密码泄露检测功能。您可以使用信用卡或 现有 Google Cloud 项目的结算 ID。如果您需要结算方面的帮助, 请与 Cloud Billing 支持团队联系。
检查是否存在已泄露和泄露的凭据
您可以使用加密函数或 Docker 容器来检查一组凭据是否已泄露。
Docker 容器是一个开源客户端,用于实现安全多方计算,以保护最终用户隐私并安全地查找密码泄露。如需了解详情,请参阅 GitHub 代码库。 Docker 容器 简化了实现加密的复杂性 并简化安装过程。它还可以托管 部署容器应用
加密函数
如需检查一组凭据是否已被泄露,请使用密码泄露检测功能 在针对登录、密码更改和 密码重置。
如需检查是否存在密码泄露和被盗用的凭据,请完成以下步骤:
生成请求参数
使用 高隐私协议所要求的所有加密功能。 reCAPTCHA 提供 Java 和 TypeScript 库, 生成以下字段:
若要创建密码检查验证,请创建一个
PasswordCheckVerifier
对象。PasswordCheckVerifier verifier = new PasswordCheckVerifier();
如需发起验证,请调用
PasswordCheckVerifier#createVerification
。此方法使用用户名和密码来计算 执行密码检查。PasswordCheckVerification verification = verifier.createVerification("username", "password").get();
创建 评估 验证这些技术
byte[] lookupHashPrefix = verification.getLookupHashPrefix(); byte[] encryptedUserCredentialsHash = verification.getEncryptedUserCredentialsHash();
字节数组
lookupHashPrefix
和encryptedUserCredentialsHash
包含发起密码检查Assessment
所需的参数。
创建评估以检测密码泄露
使用 projects.assessments.create
方法。
在使用任何请求数据之前,请先进行以下替换:
- PROJECT_ID:您的 Google Cloud 项目 ID
- LOOKUP_HASH_PREFIX:用户名 SHA-256 哈希前缀
- ENCRYPTED_USER_CREDENTIALS_HASH:已加密的用户凭据 Scrypt 哈希
HTTP 方法和网址:
POST https://recaptchaenterprise.googleapis.com/v1/projects/PROJECT_ID/assessments
请求 JSON 正文:
{ "private_password_leak_verification": { "lookup_hash_prefix": "LOOKUP_HASH_PREFIX", "encrypted_user_credentials_hash": "ENCRYPTED_USER_CREDENTIALS_HASH" } }
如需发送请求,请选择以下方式之一:
curl
将请求正文保存在名为 request.json
的文件中,然后执行以下命令:
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://recaptchaenterprise.googleapis.com/v1/projects/PROJECT_ID/assessments"
PowerShell
将请求正文保存在名为 request.json
的文件中,然后执行以下命令:
$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }
Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://recaptchaenterprise.googleapis.com/v1/projects/PROJECT_ID/assessments" | Select-Object -Expand Content
您应该收到类似以下内容的 JSON 响应:
{ "name": "projects/698047609967/assessments/fb22000000000000", "score": 0, "reasons": [], "privatePasswordLeakVerification": { "lookupHashPrefix": "zoxZwA==", "encryptedUserCredentialsHash": "AyRihRcKaGLj/FA/r2uqQY/fzfTaDb/nEcIUMeD3Tygp", "reencryptedUserCredentialsHash": "Aw65yEbLM39ww1ridDEfx5VhkWo11tzn/R1B88Qqwr/+" "encryptedLeakMatchPrefixes": [ "n/n5fvPD6rmQPFyb4xk=", "IVQqzXsbZenaibID6OI=", ..., "INeMMndrfnlf6osCVvs=", "MkIpxt2x4mtyBnRODu0=", "AqUyAUWzi+v7Kx03e6o="] } }
验证评估中泄露的凭据
从评估响应中提取字段
reEncryptedUserCredentials
和 encryptedLeakMatchPrefixes
,并将它们传递给
验证程序对象,以确定凭据是否已泄露。
PasswordCheckResult result = verifier.verify(verification,
result.getReEncryptedUserCredentials(),
result.getEncryptedLeakMatchPrefixes()
).get();
System.out.println("Credentials leaked: " + result.areCredentialsLeaked());
代码示例
了解如何使用 TypeScript,请参阅 GitHub 上的 TypeScript 代码示例。
以下代码示例展示了如何使用 Java 实现密码泄露检测:
Java
如需向 reCAPTCHA 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
Docker 容器
如需检查凭据是否泄露,请使用 localhost 连接或在容器上设置 HTTPS,将用户名和密码凭据对安全地发送到容器。然后,容器会先对这些凭据进行加密,然后再向 reCAPTCHA 发出 API 请求,并在本地验证重新加密的结果。
如需向 Docker 容器发送请求,请完成以下步骤:
准备运行 Docker 容器
选择身份验证策略。
将 PLD 容器配置为使用 HTTPS 或在仅限 localhost 的演示中运行 模式。
由于该容器接受敏感的最终用户凭据(用户名和密码),因此必须使用 HTTPS 或在仅限本地主机的演示模式下运行。有关 HTTPS 配置的指导, GitHub 上的 README。
以下步骤使用 API 密钥身份验证,并在仅限本地主机的演示模式下运行客户端。
构建和运行 Docker 容器
克隆代码库:
git clone github.com/GoogleCloudPlatform/reCAPTCHA-PLD
构建容器。
docker build . -t pld-local
启动容器:
docker run --network host \ -e RECAPTCHA_PROJECT_ID=PROJECT_ID \ -e GOOGLE_CLOUD_API_KEY=API_KEY \ pld-local
容器启动并开始在 localhost 的 8080 端口上处理请求。
发送 localhost 请求
在使用任何请求数据之前,请先进行以下替换:
- LEAKED_USERNAME:已泄露的凭据对的用户名。
- LEAKED_PASSWORD:已泄露的凭据对的密码。
HTTP 方法和网址:
POST http://localhost:8080/createAssessment/
请求 JSON 正文:
{ "username":"LEAKED_USERNAME", "password":"LEAKED_PASSWORD" }
如需发送请求,请选择以下方式之一:
curl
将请求正文保存在名为 request.json
的文件中,然后执行以下命令:
curl -X POST \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"http://localhost:8080/createAssessment/"
PowerShell
将请求正文保存在名为 request.json
的文件中,然后执行以下命令:
$headers = @{ }
Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "http://localhost:8080/createAssessment/" | Select-Object -Expand Content
您应该收到类似以下内容的 JSON 响应:
{ "leakedStatus":"LEAKED" } OR { "leakedStatus":"NO_STATUS" }
解读判定结果并采取措施
评估响应会显示凭据是否已泄露,并为您提供 您可以参考这些信息来采取适当措施来保护自己的用户。
下表列出了在检测到泄露的密码时建议采取的操作:
检测到密码泄露 | 用于保护用户的操作 |
---|---|
登录期间 |
|
在创建账号或重置密码时 |
|
如果您尚未在网站上使用 MFA 提供程序,则可以使用 reCAPTCHA 的 MFA 功能。
后续步骤
- 了解如何使用多重身份验证 (MFA)
- 了解如何使用 reCAPTCHA 账号保护程序保护用户账号