En esta página se describe cómo usar la función de protección de contraseñas de reCAPTCHA para detectar filtraciones de contraseñas y credenciales vulneradas, y así evitar las apropiaciones de cuentas (ATOs) y los ataques de relleno de credenciales. Con reCAPTCHA, puedes realizar auditorías periódicas de las credenciales de los usuarios (contraseñas) como parte de cualquier evaluación para asegurarte de que no se hayan filtrado ni vulnerado. Para llevar a cabo estas evaluaciones, Google usa la función Verificación de contraseñas.
Antes de empezar
Verify that billing is enabled for your Google Cloud project.
Para usar la función de protección de contraseñas, reCAPTCHA requiere que la facturación esté vinculada y habilitada en el proyecto. Puedes habilitar la facturación con una tarjeta de crédito o con un ID de facturación de proyecto Google Cloud ya creado. Si necesitas ayuda con la facturación, ponte en contacto con el equipo de Asistencia de Facturación de Cloud.
Comprobar si hay credenciales vulneradas y filtradas
Puedes comprobar si un conjunto de credenciales se ha visto comprometido mediante funciones criptográficas o con el contenedor de Docker.
El contenedor de Docker es un cliente de código abierto que implementa la computación multiparte segura que se necesita para proteger la privacidad del usuario final y buscar filtraciones de contraseñas de forma segura. Para obtener más información, consulta el repositorio de GitHub. El contenedor Docker abstrae la complejidad de implementar los algoritmos criptográficos y simplifica el proceso de instalación. También te permite alojar la aplicación de contenedor en tu infraestructura.
Función criptográfica
Para comprobar si un conjunto de credenciales se ha visto comprometido, usa la defensa de contraseñas al crear evaluaciones para acciones como inicios de sesión, cambios de contraseña y restablecimientos de contraseña.
Para comprobar si hay contraseñas filtradas y credenciales vulneradas, sigue estos pasos:
- Generar parámetros de solicitud.
- Crea una evaluación para detectar filtraciones de contraseñas.
- Verificar credenciales filtradas de una evaluación
- Interpretar el veredicto y tomar medidas.
Generar parámetros de solicitud
Calcula los parámetros de solicitud necesarios mediante las funciones criptográficas que requiere el protocolo de alta privacidad. reCAPTCHA proporciona bibliotecas Java y TypeScript para ayudarte a generar estos campos:
Para crear verificaciones de comprobación de contraseñas, crea un objeto
PasswordCheckVerifier
.PasswordCheckVerifier verifier = new PasswordCheckVerifier();
Para iniciar una verificación, llama al
PasswordCheckVerifier#createVerification
. Este método usa el nombre de usuario y la contraseña para calcular los parámetros que se usarán en la comprobación de la contraseña.PasswordCheckVerification verification = verifier.createVerification("username", "password").get();
Crea una evaluación con los parámetros de verificación.
byte[] lookupHashPrefix = verification.getLookupHashPrefix(); byte[] encryptedUserCredentialsHash = verification.getEncryptedUserCredentialsHash();
Las matrices de bytes
lookupHashPrefix
yencryptedUserCredentialsHash
contienen los parámetros necesarios para iniciar una comprobación de contraseñasAssessment
.
Crear una evaluación para detectar filtraciones de contraseñas
Usa el método projects.assessments.create
.
Antes de usar los datos de la solicitud, haz las siguientes sustituciones:
- PROJECT_ID: tu ID de proyecto Google Cloud
- LOOKUP_HASH_PREFIX: prefijo del prefijo del hash SHA-256 del nombre de usuario
- ENCRYPTED_USER_CREDENTIALS_HASH: hash Scrypt de las credenciales de usuario cifradas
Método HTTP y URL:
POST https://recaptchaenterprise.googleapis.com/v1/projects/PROJECT_ID/assessments
Cuerpo JSON de la solicitud:
{ "private_password_leak_verification": { "lookup_hash_prefix": "LOOKUP_HASH_PREFIX", "encrypted_user_credentials_hash": "ENCRYPTED_USER_CREDENTIALS_HASH" } }
Para enviar tu solicitud, elige una de estas opciones:
curl
Guarda el cuerpo de la solicitud en un archivo llamado request.json
y ejecuta el siguiente comando:
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
Guarda el cuerpo de la solicitud en un archivo llamado request.json
y ejecuta el siguiente comando:
$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
Deberías recibir una respuesta JSON similar a la siguiente:
{ "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="] } }
Verificar credenciales filtradas de una evaluación
Extrae los campos reEncryptedUserCredentials
y encryptedLeakMatchPrefixes
de la respuesta de la evaluación y pásalos al objeto de verificación para determinar si las credenciales se han filtrado o no.
PasswordCheckResult result = verifier.verify(verification,
result.getReEncryptedUserCredentials(),
result.getEncryptedLeakMatchPrefixes()
).get();
System.out.println("Credentials leaked: " + result.areCredentialsLeaked());
Código de ejemplo
Node.js (TypeScript)
Para saber cómo implementar la detección de filtraciones de contraseñas con Node.js (TypeScript), consulta el código de ejemplo de TypeScript en GitHub.
Java
Para autenticarte en reCAPTCHA, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Contenedor Docker
Para comprobar si se han filtrado credenciales, envía de forma segura el par de credenciales de nombre de usuario y contraseña al contenedor mediante una conexión localhost o configurando HTTPS en el contenedor. A continuación, el contenedor cifra estas credenciales antes de hacer una solicitud de API a reCAPTCHA y verifica el resultado recifrado de forma local.
Para enviar solicitudes al contenedor Docker, sigue estos pasos:
- Configura Docker.
- Prepara un entorno para el contenedor Docker.
- Crea y ejecuta el contenedor.
- Enviar solicitudes HTTP al contenedor.
- Interpretar el veredicto y tomar medidas.
Preparar la ejecución del contenedor Docker
Elige una estrategia de autenticación.
El contenedor admite la configuración de credenciales predeterminadas de la aplicación o puede aceptar una clave de API para la autenticación.
Configura el contenedor de PLD para que se ejecute con HTTPS o en un modo de demostración solo para localhost.
Como el contenedor acepta credenciales sensibles de usuarios finales (nombres de usuario y contraseñas), debe ejecutarse con HTTPS o en un modo de demostración solo para localhost. Para obtener información sobre la configuración de HTTPS, consulta el archivo README en GitHub.
En los siguientes pasos se usa la autenticación con clave de API y se ejecuta el cliente en el modo de demostración solo para localhost.
Compilar y ejecutar el contenedor Docker
Clona el repositorio:
git clone github.com/GoogleCloudPlatform/reCAPTCHA-PLD
Compila el contenedor:
docker build . -t pld-local
Inicia el contenedor:
docker run --network host \ -e RECAPTCHA_PROJECT_ID=PROJECT_ID \ -e GOOGLE_CLOUD_API_KEY=API_KEY \ pld-local
El contenedor se inicia y empieza a atender solicitudes en el puerto 8080 de localhost.
Enviar solicitudes de localhost
Antes de usar los datos de la solicitud, haz las siguientes sustituciones:
- LEAKED_USERNAME: nombre de usuario del par de credenciales filtradas.
- LEAKED_PASSWORD: contraseña del par de credenciales filtradas.
Método HTTP y URL:
POST http://localhost:8080/createAssessment/
Cuerpo JSON de la solicitud:
{ "username":"LEAKED_USERNAME", "password":"LEAKED_PASSWORD" }
Para enviar tu solicitud, elige una de estas opciones:
curl
Guarda el cuerpo de la solicitud en un archivo llamado request.json
y ejecuta el siguiente comando:
curl -X POST \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"http://localhost:8080/createAssessment/"
PowerShell
Guarda el cuerpo de la solicitud en un archivo llamado request.json
y ejecuta el siguiente comando:
$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
Deberías recibir una respuesta JSON similar a la siguiente:
{ "leakedStatus":"LEAKED" } OR { "leakedStatus":"NO_STATUS" }
Interpretar el veredicto y tomar medidas
La respuesta de la evaluación muestra si se han filtrado las credenciales y te proporciona información que puedes usar para tomar las medidas adecuadas para proteger a tus usuarios.
En la siguiente tabla se enumeran las acciones recomendadas que puedes llevar a cabo cuando se detecta una contraseña filtrada:
Contraseña filtrada detectada | Acciones para proteger a tus usuarios |
---|---|
Durante el inicio de sesión |
|
Durante la creación de la cuenta o el cambio de contraseña |
|
Si aún no usas ningún proveedor de MFA en tu sitio, puedes usar la función de MFA de reCAPTCHA.
Siguientes pasos
- Consulta cómo usar la autenticación multifactor (MFA).
- Consulta cómo proteger las cuentas de los usuarios con Account Defender de reCAPTCHA.