«No aparece» no es «nunca se filtró»
Un comprobador local suele devolver solo dos resultados: aparece o no aparece. El acierto es fácil de usar. Esa cadena ya está en una lista pública de contraseñas frecuentes; seguir con ella es quedarse en el primer lote que prueba un atacante. El fallo es donde se añade una segunda afirmación: si la lista «viene de filtraciones», no aparecer debe significar «limpia».
Una lista solo responde por las filas que contiene. Un volcado interno que no se ha publicado, un registro de infostealer que ningún corpus público ha absorbido todavía, o una contraseña robada en un sitio pequeño y nunca republicada no van a estar en los pocos cientos o pocos miles de líneas que acaba de bajar la pestaña. La lectura honesta de un «no aparece» es: con esta lista local y esta regla de coincidencia, no se encontró la cadena exacta ni las pocas variantes que el script sabe probar. Esa frase nunca prometió «toda la red».
Escribe ese límite antes de decidir el siguiente paso. Un acierto es motivo para cambiar la contraseña. Un fallo sigue dejando abiertas la longitud, la reutilización y si la generó un gestor al azar. La lista es un filtro. No es un certificado de inocencia.
Contra qué tipo de adivinación sirve la lista
Los atacantes casi nunca recorren de a a zzzz…. Los dos caminos habituales son el relleno de credenciales —probar un usuario y una contraseña filtrados en otros sitios— y la adivinación en línea, que empieza por lo alto de los rankings públicos de contraseñas débiles. 123456, password y qwerty encabezan esas listas porque la gente las sigue eligiendo, no porque «se vean cortas». Unas pocas pruebas suelen bastar.
Una lista de contraseñas frecuentes apunta a esa capa. Marca cadenas que ya se abusan, mientras aún puedes cambiarlas. No responde cuánto mide el espacio de búsqueda, ni si un corpus aún no publicado ya tiene esta fila. Eso es estimación de entropía y un corpus de filtraciones mucho más grande. No deberían fundirse en un solo veredicto con «¿parece una contraseña débil habitual?».
Por eso una lista que no es especialmente larga sigue siendo útil. El inicio de sesión en línea casi siempre tiene límite de intentos. El atacante tiene un presupuesto pequeño antes de que se bloquee la cuenta, así que prueba primero las contraseñas mejor clasificadas. NIST SP 800-63B-4 dice que el sentido de una blocklist es frenar las contraseñas que es probable adivinar antes de que entre el throttling. Cuando la lista ya cubre ese objetivo, las filas extra aportan poco, porque el ataque en línea ya está limitado. Una lista local de contraseñas frecuentes se construye para ese objetivo. No está pensada para contener cada contraseña que alguna vez se filtró.
NIST pide comparar la cadena entera, no añadir reglas de complejidad
El National Institute of Standards and Technology de EE. UU., en SP 800-63B-4, escribe la comparación como un paso obligatorio para quien acepta una contraseña: al crearla o cambiarla, hay que contrastar la candidata entera con una blocklist de contraseñas comunes, previsibles o comprometidas. La comprobación no es «¿contiene una palabra del diccionario?» ni «¿falta un símbolo?». Un acierto debe rechazarse, y hay que decirle al usuario por qué.
La misma sección reescribe la política de contraseñas que se ha malentendido más de una década. Quien verifica no debe exigir una mezcla de mayúsculas, dígitos y símbolos. No debe forzar cambios periódicos salvo que haya evidencia de que este autenticador se comprometió. Una contraseña usada como único factor debe tener al menos 15 caracteres; como un factor de la autenticación multifactor, el suelo es 8. Esas frases van dirigidas a sitios que aceptan contraseñas, no a una página de autocomprobación en el navegador. Aun así ayudan a quien lee el resultado: marcar casillas de complejidad no demuestra seguridad. Lo primero que merece bloquearse es una cadena entera que ya está en una lista pública.
NIST también recuerda dar una guía tras el rechazo, para que el usuario no se quede en reescribir password como Password1. Si una lista local además prueba mayúsculas y minúsculas, dos o tres dígitos al final y leet habitual (@ por a, 0 por o), ese es el recauchutado que persigue. Sigue siendo una heurística, no una prueba criptográfica. P@ssw0rd2026! puede detectarse. Una variante que las reglas no codifican, no.
No hagas esta comprobación con una contraseña que sigas usando. Si necesitas contrastar una lista, usa una clave ya retirada o una cadena de prueba desechable. Estás comprobando la regla y el tráfico, no volviendo a exponer una credencial viva.
Lista local corta, consulta por prefijo de hash y corpus offline completo
«¿Se filtró?» son al menos tres métodos distintos. Si los mezclas, un «no aparece» se convierte en «nunca se filtró». La diferencia no está en el eslogan. Está en qué dato sale del dispositivo y qué puede ver un servidor.
El primer método es una lista local corta. La página descarga un texto público en la pestaña actual, el script arma un conjunto en memoria y busca la cadena que escribiste más unas pocas variantes. Lo que sale es el archivo de la lista, no la contraseña a comprobar. La cobertura es el número de líneas no vacías. Toma como ejemplo el leaked-top10k.txt que MakePwd sirve con el comprobador. El nombre dice top10k. Abre la respuesta y cuenta las líneas tú: hoy ese archivo tiene algo más de 800 entradas frecuentes —unas 860—, no 10.000, y no toda la red. Si la lista no carga, la implementación cae a un conjunto mínimo interno (por ejemplo password y 123456). La cobertura se encoge. La comprobación sigue en este dispositivo.
El segundo método es la consulta por rangos de Pwned Passwords de Have I Been Pwned. La documentación oficial describe el corpus como cientos de millones de contraseñas que han aparecido en filtraciones. El cliente calcula el hash en local con SHA-1 (o NTLM) y envía solo los cinco primeros caracteres hexadecimales a https://api.pwnedpasswords.com/range/{prefix}. Luego compara los sufijos devueltos con el hash completo que ya calculó. Por diseño no se envían ni el texto en claro ni el hash entero. Eso es k-anonimato: el servidor solo sabe en cuál de unos un millón de cubos de prefijo caíste (165). Sigue siendo una consulta externa. Lo consultado no es la contraseña. En noviembre de 2025, HIBP incorporó unos 1.300 millones de contraseñas únicas del corpus de relleno de credenciales de Synthient, de las que unos 625 millones eran nuevas para ese servicio. En junio de 2026 añadió unos 124 millones de contraseñas únicas procedentes de registros de infostealer. Esos números muestran que el corpus crece. No significan «consultado una vez, limpio para siempre».
El tercer método es descargar el corpus entero a tu máquina o a tu red y comparar sin conexión. HIBP también publica esa descarga. La cobertura se parece a la del segundo método, pero no se envía ningún prefijo a api.pwnedpasswords.com. El coste son las actualizaciones, el almacenamiento y el índice de hashes que mantienes tú.
| Método | Qué sale de este dispositivo | Qué puede sostener un «no aparece» |
|---|---|---|
| Lista local de contraseñas frecuentes | El archivo de la lista; la contraseña a comprobar no debería | No está en esta lista (ni en las variantes que implementa el script) |
| Consulta por rangos de HIBP | El prefijo de 5 caracteres SHA-1 / NTLM | No está en el corpus actual de Pwned Passwords |
| Corpus offline completo | Ninguna petición de consulta | No está en la copia que descargaste |
Ninguna de esas tres frases se puede reescribir como «esta contraseña nunca apareció en ninguna filtración». Los volcados no publicados, los registros aún no ingeridos y una contraseña que nunca entregaste a un tercero quedan fuera de la obligación de cualquier colección. La lista local es la más estrecha de las tres. Su ventaja es que la contraseña a comprobar no tiene que salir de la pestaña.
Qué puede sostener un acierto y un fallo
Un acierto admite una frase dura: esta cadena ya está en una lista pública de contraseñas frecuentes, o solo es un recauchutado que la lista sabe reconocer. Seguir usándola es quedarse en el conjunto que el relleno de credenciales y la adivinación en línea prueban primero. El movimiento correcto es cambiarla, y no reutilizar la misma cadena en otros sitios.
Un fallo debe llevar un alcance. Sostiene «no parece una contraseña débil habitual de esta lista». No sostiene «nunca se volcó», «es seguro reutilizarla en todas partes» ni «la entropía basta». Una contraseña aleatoria de 20 caracteres no aparecerá. Una que solo salió en un volcado no publicado tampoco. El chip de la página se ve igual. El significado, no.
También está el caso que se ve largo y aun así debe marcarse débil. Un acierto de lista manda sobre la entropía. password son ocho letras, así que una estimación por conjunto de caracteres produce un recuento de bits distinto de cero, y todo el mundo la prueba primero. Si un comprobador local fuerza el grado a débil tras un acierto, el motivo es la lista, no una fórmula de bits rota. Lo inverso también vale. Un fallo más una entropía alta solo sostiene «no parece común, y la fuerza bruta se ve cara». Eso no es «ya es segura». La reutilización, el phishing y un sitio que guarda texto en claro quedan fuera de esta comparación.
La frase más corta que puedes mandar a un compañero: un acierto significa cámbiala ya; un fallo solo descarta esta lista. Después, pregunta si se reutiliza y si se generó al azar.
Compruébalo al momento: el archivo de la lista y luego Network
«Comparado en local, no se sube nada» no puede demostrarse a sí mismo. Lo que sí puedes ver al momento son dos cosas: qué archivo de lista descargó el navegador, y si la cadena que escribiste salió como dato de negocio.
Empieza por la lista. Abre Red (Network) en las herramientas de desarrollo, filtra una petición cuyo nombre contenga leaked o top y guarda la respuesta como texto. Cuenta las líneas no vacías en un editor. Revisa las primeras filas: deberían ser contraseñas frecuentes públicas como 123456 y password. El recuento que verificaste es el denominador de «no aparece». No escribas «10.000 entradas» porque el nombre del archivo lleva 10k.
Luego mira la contraseña a comprobar. Prepara un canario que nunca aparezca en el trabajo real, por ejemplo canary-audit-2026-x7k, y escríbelo en el comprobador. Activa Preserve log y pega esa cadena en el filtro. No debería aparecer en la línea de una petición XHR / Fetch, ni en la consulta, ni en el cuerpo. Tampoco en la consulta ni el cuerpo de analytics. Los estáticos, las fuentes y el archivo de la lista sí pueden aparecer: que la lista salga del origen es lo esperado. Que salga la contraseña a comprobar es un fallo.
- Abre Network, activa Preserve log, termina una comprobación, localiza la respuesta del archivo de lista y cuenta las líneas.
- Vuelve a comprobar con una contraseña canario y busca esa cadena en el filtro. Un acierto en cualquier petición significa que el texto en claro salió de la pestaña.
- Si no hay acierto, abre las peticiones de analytics y confirma que títulos y rutas pueden aparecer, pero el texto completo del cuadro de entrada no.
La afirmación que sostiene esto es estrecha: en esta ejecución, la contraseña a comprobar no salió de la pestaña actual como campo HTTP observado, y la cobertura de la lista es igual a las líneas que contaste. No demuestra que una extensión no leyera el cuadro de entrada, ni que el script de la semana que viene se comporte igual. Si cambias de navegador o de versión, merece la pena volver a buscar el canario.
La entropía y la lista responden a preguntas distintas
Una página de comprobación suele mostrar un grado, un recuento de bits y si la lista acertó. Trátalos como una sola puntuación y te confundirás cuando los bits se vean bien pero la lista acierte, o cuando no aparezca pero la cadena sea corta. Responden a preguntas distintas. No deberían anularse.
La entropía pregunta: si un atacante recorre el conjunto de caracteres por fuerza bruta, ¿cuánto tarda de media? Una fórmula habitual es longitud por log2(tamaño del conjunto), y luego un descuento por caracteres repetidos o rachas del mismo carácter. Si los umbrales se escriben como ≥ 80 bits muy fuerte, ≥ 60 fuerte, ≥ 40 media y el resto débil, esas son bandejas de este estimador. No son tiempos de descifrado de laboratorio. Las líneas de tiempo offline y en línea también usan ritmos distintos: por ejemplo 1010 intentos por segundo offline y 103 en línea, y luego el caso medio (la mitad del espacio de búsqueda). Cambia el ritmo y cambia el tiempo. La contraseña, no.
La lista pregunta: ¿esta cadena ya se abusa en público? No usa el recuento de bits. Un acierto de lista debe seguir marcándose débil aunque lleve mayúscula y un símbolo. Un fallo de seis caracteres tendrá poca entropía, y la longitud sola lo empujará a débil: eso no tiene que ver con un corpus de filtraciones. El aviso de «más débil de lo que debería» por debajo de 8 caracteres es un aviso de longitud, no de base de filtraciones.
Así que una lectura completa mira al menos tres sitios: si la lista acertó, si la cadena es demasiado corta y en qué bandeja de entropía cayó. Solo después de esos tres puedes decir «qué aspecto tiene esta cadena ahora». Eso sigue sin sustituir un gestor de contraseñas, ni «una contraseña aleatoria por sitio».
Usa un comprobador listo al abrir para practicar el límite
Si quieres una página que escriba el límite a la vista, empieza por la comprobación de contraseñas de MakePwd. Se abre sin registro y no hay almacén de contraseñas. La copia del producto dice que la contraseña a comprobar no se sube y no se escribe en analytics. La coincidencia ocurre contra una lista pública de contraseñas frecuentes descargada en esta pestaña. No es Have I Been Pwned, ni una consulta de relleno de credenciales a escala web. Un acierto fuerza el grado a débil. Por encima de 128 caracteres, la implementación solo hace coincidencia exacta y se salta dígitos finales y leet.
Practica con una cadena de prueba desechable, no con una contraseña viva. Deja Network abierto: deberías ver el archivo de la lista y quizá analytics, no el texto completo del cuadro de entrada. Cuando necesites una contraseña nueva, el generador también está listo al abrir. El modo aleatorio va de 6 a 128 caracteres, 16 por defecto, y las cadenas de menos de 8 reciben un aviso de que son más débiles de lo que deberían. Generar y comprobar terminan en el navegador. El texto en claro se queda en este dispositivo por defecto.
El punto del ejercicio no es demostrar que un sitio «busca más». Es poder decirle a un compañero tres frases: conté las líneas de la lista; busqué un canario en Network; ante un fallo solo escribí «no está en esta lista». En cualquier otra página que afirme una «comprobación local de contraseñas débiles», los mismos pasos siguen valiendo.
Tres cosas para recordar la próxima vez
Primero, un acierto significa cámbiala; un fallo solo descarta la lista actual —no lo leas como nunca se filtró. Segundo, una lista local corta, el prefijo de hash de cinco caracteres de HIBP y un corpus offline completo son tres caminos de datos distintos, y el significado de un fallo sigue al camino. Tercero, no dejes que la entropía y la lista se anulen: una contraseña corta puede no aparecer, y una larga pero habitual puede acertar.
Si la siguiente pregunta es si el texto en claro salió de esta pestaña como dato de negocio, lee Cifrar en el navegador: cómo comprobar que el original no salió de este dispositivo. Esta pieza solo convierte «qué cubre la lista de contraseñas débiles» en una frase que puedes escribir.