本页介绍了如何使用 reCAPTCHA 的密码防御功能来检测密码泄露和凭据盗用,以防范账号盗用 (ATO) 和凭据填充攻击。借助 reCAPTCHA,您可以在进行任何评估过程中对用户凭据(密码)进行定期审核,以确保它们没有被泄露或盗用。为了执行这些评估,Google 会使用密码安全检查功能。
准备工作
Verify 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());
代码示例
Node.js (TypeScript)
如需了解如何使用 Node.js (TypeScript) 实现密码泄露检测,请参阅 GitHub 上的 TypeScript 代码示例。
Java
如需向 reCAPTCHA 进行身份验证,请设置应用默认凭据。如需了解详情,请参阅为本地开发环境设置身份验证。
Docker 容器
如需检查凭据是否泄露,请使用 localhost 连接或在容器上设置 HTTPS,以将用户名和密码凭据对安全地发送到容器。然后,容器会在向 reCAPTCHA 发出 API 请求之前加密这些凭据,并在本地验证重新加密的结果。
如需向 Docker 容器发送请求,请完成以下步骤:
准备运行 Docker 容器
选择身份验证策略。
将 PLD 容器配置为通过 HTTPS 运行或以仅限 localhost 的演示模式运行。
由于容器接受敏感的最终用户凭据(用户名和密码),因此必须通过 HTTPS 运行,或者以仅限 localhost 的演示模式运行。如需查看有关 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 账号保护程序来保护用户账号