Empieza por la conclusión: una lista local de contraseñas débiles solo sostiene una afirmación estrecha — «¿esta cadena parece una contraseña que ya se abusa por todas partes?». Que no coincida no prueba que nunca haya salido en un dump. Una coincidencia solo dice que es demasiado común y hay que cambiarla ya. La consulta por rango de contraseñas de Have I Been Pwned es otro protocolo: envía los cinco primeros caracteres de un hash SHA-1. Antes de pegar el texto en claro en cualquier «comprobador en línea», confirma cuál de los tres vas a ejecutar.
Responde a la intención de búsqueda en una frase
Una lista local de contraseñas débiles solo puede demostrar esto: la cadena que escribiste coincide o no con la lista pública de alta frecuencia ya descargada en esta pestaña. No puede demostrar «nunca se ha visto en la web», ni responder «¿mi correo ha salido en una brecha?». Las consultas por rango de Pwned Passwords de Have I Been Pwned (HIBP) son otro camino: este dispositivo calcula SHA-1 y solo envía los cinco primeros caracteres hexadecimales a https://api.pwnedpasswords.com/range/{prefix}; el sufijo restante se compara en el cliente.
Este artículo es para desarrolladores y operaciones que quieren «pasar por el comprobador» una contraseña antigua, y para quien en soporte recibe un enlace a un «verificador de contraseñas en línea». No sustituye las instrucciones de Comprobar contraseña, ni repite el recorrido de Network sobre «si el cifrado local subió el texto en claro». Lo que te llevas es qué sale de este equipo en cada método, hasta dónde llegan las variantes de la lista local, y qué frase puede entrar de verdad en un ticket si hay coincidencia o si no la hay.
Tres formas de «comprobar una filtración» no son el mismo trabajo
Busca «comprobar si mi contraseña ha sido filtrada» y los resultados mezclan protocolos que no tienen nada que ver. Unos sitios hacen POST de lo que escribes. Otros llaman a la API de rango con k-anonimato de HIBP. Otros descargan una lista corta y la buscan en el navegador. Los tres pueden pintar «no encontrada» o «filtrada» con el mismo tipo de insignia. La línea de petición es distinta, y también lo es la afirmación que puedes defender.
La OWASP Authentication Cheat Sheet pide a los flujos de alta y de cambio de contraseña que bloqueen las contraseñas comunes y las ya comprometidas, y nombra tanto Pwned Passwords como listas públicas del estilo SecLists. No trata una lista local de ochocientas líneas y un corpus de mil millones de hashes como la misma prueba. Si un ticket solo dice «comprobado, no filtrada», quien lo lea después no puede saber qué red usaste.
| Método | Qué sale de este equipo | Qué puede sostener una ausencia |
|---|---|---|
| Subir el texto en claro o un hash completo | La contraseña misma, o un resumen suficiente para compararla o recuperarla | Solo que este sitio no la marcó esta vez — no que sea segura |
| Consulta por rango de HIBP | Los 5 primeros caracteres hexadecimales de un hash SHA-1 o NTLM | Ese hash no está en el índice actual de HIBP |
| Lista pública local de alta frecuencia | El archivo de la lista; la contraseña que compruebas se queda en la pestaña | Esta lista corta y sus reglas de variantes no coincidieron |
El tercer método sigue usando la red: el navegador hace GET del archivo de la lista. Ese archivo es un vocabulario público, no tu contraseña. Tratar toda petición como «salió a internet, luego se subió la contraseña» lee mal el límite. Tratar la palabra «local» de la página como prueba pasa por alto el primer tipo de sitio.
No experimentes con una contraseña de producción, un token de API sin rotar o el PIN de la banca en línea. Inventa un canario que exista solo para esta comprobación — por ejemplo CanaryPwd-20260902-xK9. Estás mirando si esta petición se llevó esa cadena, no exponiendo un secreto real una segunda vez.
Qué contrasta de verdad la lista local
En la página Comprobar contraseña de FastPwd, la lista se pide al origen mismo, en la ruta data/leaked-top10k.txt, y luego se construye en esta pestaña una tabla de clave en minúsculas a puesto. El nombre del archivo dice top10k porque así suelen titularse las listas públicas de alta frecuencia. Abre la respuesta y puedes contar poco más de 800 líneas no vacías; empiezan por 123456, password, qwerty — cadenas que reaparecen dump tras dump. El texto del producto no llama a ese archivo «10.000 entradas» ni «todas las brechas de la web».
La búsqueda no es una sola igualdad. La implementación recorre cuatro etapas. Una coincidencia en cualquiera marca la contraseña en rojo y fuerza la nota a Débil.
- Coincidencia exacta: la entrada es igual a un renglón de la lista.
- Normalizar mayúsculas: primero a minúsculas, así
Passwordypasswordson la misma entrada. - Quitar un 0–999 final:
qwerty123se reduce aqwertyy luego se busca. - Leet habitual:
@/4→a,3→e,1/!→i,0→o,5/$→s,7→t. El mismo paso puede correr después de quitar los dígitos finales.
Si la entrada supera los 128 caracteres, las dos últimas etapas no se ejecutan: solo coincidencia exacta y en minúsculas. Si el archivo de la lista no carga, la página cae a un conjunto mínimo integrado: password, 123456, 12345678, qwerty, admin123, y la línea de estado sigue diciendo que la comprobación terminó en este dispositivo. El puesto solo sirve para la pista: Top 100, Top 500, Top 1,000, o el recurso «Lista pública de fugas». No es el recuento de HIBP del tipo «vista N veces».
NIST SP 800-63B-4 pide a quien verifica, al abrir cuenta y al cambiar la contraseña, que compare la candidata como cadena completa contra una lista de bloqueo de contraseñas comunes, previsibles o comprometidas — no como subcadena — y dice que no hay que apilar encima otro juego de reglas de composición. Una lista local de alta frecuencia cubre la capa «bloquea primero las que el atacante adivina». El archivo es mucho más pequeño que los diccionarios que se rocían en ataques, y mucho más pequeño que los hashes de brechas que HIBP sigue incorporando. En junio de 2026, solo la ingesta de June 2026 Stealer Logs de HIBP añadió unos 124 millones de contraseñas distintas. Poco más de 800 palabras públicas de alta frecuencia cazan 123456. No cazan una frase larga que solo apareció en un dump interno.
Qué envía una consulta por rango de HIBP — y qué no
La propia página de contraseñas de HIBP dice que una ausencia «no significa necesariamente que sea una buena contraseña, solo que no está en los datos que este sitio indexa». El protocolo está en API v3 · Pwned Passwords. El cliente hashea la contraseña con SHA-1 (o NTLM si mode=ntlm), toma los cinco primeros caracteres hexadecimales y pide GET https://api.pwnedpasswords.com/range/{prefix}. El servidor devuelve todos los sufijos de ese prefijo y un recuento de apariciones. Los 35 caracteres restantes del hash de 40 se quedan en este dispositivo para comparar.
La escala publicada se puede comprobar en el acto: una consulta por rango suele devolver unos 800 sufijos; el espacio de prefijos es 165 = 1.048.576 valores, de 00000 a FFFFF, y cada prefijo debería responder HTTP 200, no 404. La cabecera opcional Add-Padding: true rellena la respuesta hasta 800–1.000 líneas para que un observador no infiera el prefijo por la longitud. Cloudflare, en Validating Leaked Passwords with k-Anonymity, llama a esto una consulta por rango con k-anonimato: el servidor nunca recibe el hash completo de una contraseña que aún no está en el corpus, así que no puede «desenmascarar» después esa consulta por sí solo.
Consultar un correo es otro camino. La documentación es explícita: poner la dirección en la ruta entrega ese buzón a HIBP. La búsqueda de correo con k-anonimato envía los seis primeros caracteres del SHA-1 del correo — no los cinco primeros del hash de una contraseña. Si un ticket dice «lo comprobé en HIBP», escribe si consultaste un prefijo de hash de contraseña o un correo. El límite de privacidad es distinto, y también la conclusión.
FastPwd no llama a ninguna de esas API de HIBP. Comprobar contraseña puede estimar la entropía en local y contrastar esta lista pública de alta frecuencia. Si necesitas un corpus de mil millones de hashes, usa la página oficial de HIBP o una copia sin conexión que alojes tú, y abre Network para confirmar que la línea de petición solo lleva cinco caracteres hexadecimales. No des por hecho que «una herramienta de seguridad consultará HIBP por ti».
Usa Network para confirmar que la contraseña no salió
«No se sube» en la página no es una prueba. Una cadena canario sí lo es. Los pasos son de la misma familia que «¿el cifrado local se llevó el texto en claro?», pero lo que miras es el campo de la contraseña y el archivo de la lista.
- Abre Network en las herramientas para desarrolladores y marca Preserve log. Deja el filtro vacío al principio para no ocultar los informes de analítica.
- En Comprobar contraseña, escribe un canario como
CanaryPwd-20260902-xK9y espera a que termine el cálculo local — unos 280 milisegundos después de la última tecla. - Busca ese canario en la lista de peticiones. No debería aparecer en la línea de petición, en la query, en el cuerpo ni en un campo de formulario.
- Deberías ver un GET al mismo origen de
data/leaked-top10k.txt. Abre la respuesta: una contraseña pública por línea, y tu canario no debería estar entre ellas. - Si un sitio afirma hablar con HIBP, busca
api.pwnedpasswords.com/range/: la ruta debería llevar cinco caracteres hexadecimales, no el texto en claro.
La analítica de visitas puede existir. Los eventos de auditoría de FastPwd solo envían nombres — por ejemplo «auditoría iniciada», «resultado débil» o «coincidencia con la lista de fugas» — y no mandan el contenido del cuadro como parámetro. Abre un informe a /tj/matomo.php y busca el canario; no debería coincidir. Cerrar la pestaña no deja esta entrada en un servidor de FastPwd — si nunca llegó como dato de negocio. Esa frase tiene que apoyarse en la búsqueda que acabas de hacer, no en «cerré la página».
Si el canario aparece en cualquier petición, la conclusión se invierte. Da igual lo que dijera el botón — «local», «privado», «en el navegador» —: esta comprobación ya sacó la contraseña de la pestaña. Cambia de herramienta, o pasa a una lista sin conexión, y repite los mismos pasos.
Qué sostiene una coincidencia, y qué no puede sostener una ausencia
Si hay coincidencia, la frase que pertenece a un ticket es: «Esta cadena coincidió con la lista pública de alta frecuencia descargada con la página (exacta / mayúsculas / dígitos finales / leet). En este dispositivo se trata como una contraseña débil extremadamente común. Cámbiala, y no la reutilices en otros sitios.» La frase que no pertenece es: «El servidor de la otra parte confirmó que este es el texto en claro de la brecha X del año Y.» La lista local no tiene nombre de incidente ni recuento de apariciones: solo una pista de puesto.
Si no hay coincidencia, la frase defendible es más corta: «Sin coincidencia contra la lista pública de alta frecuencia actual y sus cuatro etapas de variantes.» No puedes escribir «nunca se filtró», «se puede seguir usando» ni «más limpia que HIBP». Una lista de poco más de 800 palabras de alta frecuencia no se diseñó para demostrar seguridad. Los diccionarios que rocían los atacantes, las contraseñas históricas de una empresa y una frase larga que solo salió en un dump privado no estarán en esa página.
La entropía es una tercera señal, en paralelo. La página estima bits a partir de la longitud y las clases de caracteres: ≥ 80 es Muy fuerte, ≥ 60 es Fuerte, ≥ 40 es Media, y el resto es Débil. La fuerza bruta sin conexión se muestra a unos 10.000 millones de intentos por segundo; un intento en línea, con límite de ritmo, a unos 1.000 por segundo. Esos números comparan un coste relativo. No son una cuenta atrás. Menos de 8 caracteres, o una coincidencia con el conjunto mínimo de contraseñas débiles habituales, fuerza Débil. Una coincidencia con la lista pública reescribe la nota a Débil aunque la entropía sea alta — porque un ataque de diccionario no recorre el camino de «fuerza bruta media».
Preguntas frecuentes
Si no coincide con la lista de contraseñas débiles, ¿significa que nunca se filtró?
No. La ausencia solo dice que, en la lista pública de alta frecuencia de esta pestaña, no hubo coincidencia exacta, ni por mayúsculas y minúsculas, ni al quitar un 0–999 final, ni con las sustituciones leet habituales. No prueba que esa cadena no haya salido en ningún dump, que no esté en Have I Been Pwned, ni que se pueda seguir reutilizando.
¿Have I Been Pwned envía la contraseña en claro al comprobarla?
No, si el cliente sigue la API oficial. Una consulta por rango de Pwned Passwords solo acepta los cinco primeros caracteres de un hash SHA-1 o NTLM y devuelve unos 800 sufijos; la comparación completa se queda en el cliente. El texto en claro y el hash entero no deberían aparecer en la petición. Consultar un correo es otra API: enviar la dirección en la ruta entrega ese buzón al servicio. Fíate de la línea de petición que abriste en Network, no de la etiqueta del botón.
¿La auditoría de contraseñas de FastPwd consulta Have I Been Pwned?
No. Contrasta la lista pública de alta frecuencia descargada con la página. La contraseña que compruebas no sale como dato de negocio HTTP ni se escribe en analytics. La analítica de visitas solo registra nombres de evento como «auditoría iniciada» o «resultado débil / media / fuerte». Listo para usar, sin cuenta, y en el sitio no hay almacén de contraseñas que pudiera guardar un registro de la comprobación.
Si la entropía es alta pero hay coincidencia en la lista, ¿sigue siendo una contraseña fuerte?
En este dispositivo, una coincidencia con la lista pública de contraseñas débiles fuerza la nota a Débil. La entropía estima el coste de fuerza bruta sobre un espacio de caracteres. La lista responde si esa cadena ya está en el diccionario de un atacante. Las dos preguntas no se anulan. NIST SP 800-63B-4 pide a quien verifica que contraste una lista de bloqueo de cadena completa de contraseñas comunes o comprometidas, no reglas de composición ni un recordatorio de calendario para rotar.
Recorre los pasos con una contraseña falsa
Si quieres una página cuyo límite de cálculo está escrito, abre Comprobar contraseña de FastPwd. Listo para usar, sin registro. Escribe primero password o qwerty123: deberías ver una coincidencia con la lista pública forzada a Débil. Luego escribe el canario de arriba: no debería coincidir con la lista, y una búsqueda en Network no debería encontrar esa cadena. Puedes abrir el GET de la lista y contar las líneas; deberían alinearse con «poco más de 800 palabras de alta frecuencia» de este artículo.
Tras una nota Débil, abre el generador de contraseñas y saca una cadena nueva en este dispositivo: el modo aleatorio es de 6–128 caracteres, 16 por defecto; por debajo de 8 se marca como menos segura. Si tienes que entregar la nueva contraseña a un compañero, pasa a Burn-Link: este dispositivo cifra con AES-256-GCM, el servidor solo almacena texto cifrado y la clave va detrás de la almohadilla del enlace. No pegues un Burn-Link completo de vuelta en ningún cuadro de «comprobador en línea».
El objetivo del ejercicio no es demostrar que un sitio es «absolutamente seguro». Es darte una comparación que puedas enseñar a un compañero antes de que alguien pulse Comprobar: esta pasada subió el texto en claro, envió un prefijo de hash, o usó una lista local corta; si hay coincidencia, cámbiala; si no la hay, no escribas «nunca se filtró». Los mismos pasos valen en cualquier extensión de «puntuación de seguridad» o «búsqueda de filtraciones».
La próxima vez que alguien pegue una contraseña en un comprobador, haz tres preguntas. Primera: ¿la petición llevó texto en claro o un hash completo? Segunda: ¿contrastó unas 800 palabras de alta frecuencia, o ejecutó una consulta por rango al estilo HIBP? Tercera: ¿qué frase usará el ticket si no hay coincidencia? Solo una comprobación que puedas repetir merece entrar en vuestra propia norma de contraseñas.
Para seguir leyendo
Para confirmar si la propia página del comprobador envió la cadena original, recorre Network con el mismo canario: Cómo comprobar que el cifrado local del navegador no envió el original. Cuando debas entregar un secreto completo a otra persona — no a un cuadro de comprobación —, mira por qué la clave puede ir detrás de la almohadilla, y cuándo esa capa falla: Por qué el hash de una URL puede guardar una clave, y cuándo esa protección falla. Antes de pegar tickets y registros en una IA, compara los campos en origen: Antes de pegar un ticket o un registro en una IA, comprueba qué campos salen de este equipo.