本页介绍了如何使用 reCAPTCHA 的密码泄露检测功能来检测密码泄露和凭据盗用,以防范账号盗用 (ATO) 和凭据填充攻击。借助 reCAPTCHA,您可以在进行任何评估过程中对用户凭据(密码)进行定期审核,以确保它们没有被泄露或盗用。为了执行这些评估,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 或在仅限本地主机的演示模式下运行。
由于该容器接受敏感的最终用户凭据(用户名和密码),因此必须使用 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)
- 了解如何使用 reCAPTCHA 账号卫士保护用户账号