Comprobar si una contraseña está filtrada sin enviarla: API de Pwned Passwords con curl
123456 aparece 210461208 veces, maria2020 aparece 56429 veces y una clave aleatoria de 19 caracteres aparece 0 veces; en los tres casos solo salieron 5 caracteres de la huella.
Contenido
Este artículo no lleva enlaces de afiliado.
Pwned Passwords es una lista pública de contraseñas que han aparecido en filtraciones. Tiene una API gratuita y sin clave que permite comprobar una contraseña sin enviar ni la contraseña ni su huella completa. Esta prueba lo hace desde la terminal.
Qué se probó
Prueba del 2026-11-02 con curl 8.5.0 y sha1sum de GNU coreutils 9.4, contra https://api.pwnedpasswords.com/range/. Se comprobaron tres contraseñas de ejemplo, ninguna de ellas real. No se probó la API de correos filtrados, que requiere clave de pago.
Cómo funciona
- Se calcula la huella SHA-1 de la contraseña, en mayúsculas.
- Se envían a la API solo los 5 primeros caracteres de la huella.
- La API devuelve todas las terminaciones de huellas que empiezan por esos 5 caracteres, cada una con el número de veces que aparece (formato
TERMINACION:NUMERO). - La comparación se hace en tu máquina: si la terminación de tu huella está en la lista, la contraseña está filtrada.
Con el prefijo 7C4A8, la API devolvió 1920 terminaciones en el momento de la prueba. El servidor no puede saber cuál de esas 1920 es la tuya.
El script
#!/bin/bash
# uso: pwn 'contraseña'
h=$(printf %s "$1" | sha1sum | cut -c1-40 | tr a-f A-F)
echo "enviado: ${h:0:5}"
n=$(curl -sf https://api.pwnedpasswords.com/range/${h:0:5} | grep "^${h:5}" | cut -d: -f2 | tr -d '\r')
echo "filtrada ${n:-0} veces"
printf %s evita que el salto de línea de echo cambie la huella. curl -sf hace que un fallo HTTP no se confunda con "0 veces" (con -s solo, una petición fallida acabaría en filtrada 0 veces; el script sigue sin comprobar el código de salida, así que ante un error conviene repetir la consulta). En mi prueba las líneas de la respuesta terminaban en CRLF; tr -d '\r' quita ese retorno de carro por si acaso.
Resultados
| Contraseña | Enviado | Veces filtrada |
|---|---|---|
123456 |
7C4A8 |
210461208 |
maria2020 |
969F4 |
56429 |
k7Qz-r9Lw-x2Vm-p4Ta |
23494 |
0 |
Un nombre con un año aparece decenas de miles de veces. La clave larga y aleatoria no aparece. Que no aparezca no prueba que sea segura, solo que no está en esa lista.
Privacidad de la consulta
- La API admite la cabecera
Add-Padding: true, que añade entradas falsas con contador 0 para que el tamaño de la respuesta no delate cuántos resultados reales había. La documentación oficial indica que las respuestas con relleno rondan los 800-1000 resultados; en mi prueba con el prefijo23494la respuesta tuvo 2192 líneas, 160 de ellas con contador 0, y el tamaño puede variar con el tiempo. Las entradas con contador 0 se descartan. - Cada comprobación sale por la red hacia un tercero. No pegues contraseñas reales en historiales compartidos:
pwn 'clave'deja la contraseña en el historial de la shell y en la lista de procesos mientras se ejecuta. Para claves propias, lee la contraseña sin escribirla en la línea de órdenes, por ejemplo conread -s p; ./pwn "$p".
Si sale filtrada
Si una contraseña sale filtrada aunque sea una sola vez, cámbiala en todos los sitios donde la uses.