¿Está tu contraseña en una filtración de datos?

Una filtración de datos es lo que ocurre cuando la base de datos de contraseñas de un servicio escapa a lo abierto — y un corpus de filtraciones es la colección de contraseñas cosechadas de cientos de esas fugas, indexada para que cualquiera pueda preguntar si una contraseña determinada está entre ellas. Si la tuya está, los atacantes ya la tienen: está en listas de palabras que se prueban automáticamente contra cada página de inicio de sesión que pueden alcanzar. Este artículo explica cómo funciona la comprobación sin revelar nunca la contraseña, qué significa realmente un recuento de “encontrada 52 millones de veces”, por qué “no encontrada” no es un certificado de buena salud, y por qué nunca debes pegar una contraseña en un chatbot para preguntar si es segura. Para ejecutar la comprobación, usa la Comprobación de filtración de contraseñas.

Qué es un corpus de filtraciones

Cada filtración importante deja el mismo residuo: una base de datos de nombres de usuario y contraseñas, normalmente guardadas como hashes, copiada de los sistemas de una empresa y pasada de mano en mano, vendida o publicada. Por separado, esas bases de datos son la prueba del fallo de una empresa; reunidas, deduplicadas e indexadas, se convierten en otra cosa — un censo de las contraseñas que la gente realmente usa. El corpus Pwned Passwords de Have I Been Pwned, el que consulta el comprobador de este sitio, contiene más de mil millones de contraseñas de cientos de filtraciones, y crece cada vez que surge una filtración nueva. No es una lista de contraseñas débiles compilada por teóricos. Es un registro de las contraseñas que personas reales eligieron, escribieron y perdieron.

Por eso el corpus es un espejo tan implacable. Una contraseña que inventaste en cinco segundos — un nombre más un año de nacimiento, un equipo de fútbol más un signo de exclamación, un paseo por el teclado con un dígito al final — es muy probable que ya la hayan inventado exactamente igual miles de personas, y si alguna de ellas la usó en un servicio filtrado, está en el corpus. Los atacantes no adivinan contraseñas de una en una como lo haría una persona. Practican el relleno de credenciales: toman una lista de pares de usuario y contraseña filtrados, o una lista de palabras de contraseñas filtradas, y las prueban automáticamente, millones de intentos por hora, contra páginas de inicio de sesión en todas partes. Una contraseña en el corpus es una contraseña que ya está en la lista.

Cómo funciona la comprobación de cinco caracteres

Comprobar una contraseña contra una base de datos de mil millones de entradas suena a que debería requerir enviar la contraseña a alguien — y durante años esa fue la objeción honesta a cada servicio de comprobación de filtraciones. La solución es un truco llamado k-anonimato, y es lo bastante sencillo como para enunciarlo en una frase: el servicio nunca sabe qué contraseña preguntaste, porque nunca ve lo suficiente de ella para distinguirla. Tu contraseña se convierte en hash en el navegador con SHA-1, produciendo una huella de 40 caracteres. Solo los primeros 5 caracteres de esa huella se envían a Have I Been Pwned. El servicio devuelve todos los sufijos de huella que comparten esos 5 caracteres — normalmente unos ochocientos — y tu navegador busca su propio sufijo en la lista, localmente, en tu dispositivo.

Cinco caracteres es el número que sostiene todo. Un prefijo hexadecimal de 5 caracteres tiene alrededor de un millón de valores posibles, así que cada prefijo lo comparten aproximadamente mil contraseñas en un corpus de mil millones de entradas — suficientes parecidas para que el servicio no pueda identificar tu contraseña, y suficientemente pocas para que la respuesta quepa en una sola respuesta pequeña. Nada sobre la contraseña en sí cruza la red: ni la contraseña, ni su hash completo, ni siquiera un indicio de su longitud. El mismo diseño es la razón por la que la comprobación no necesita cuenta, ni clave de API, ni un límite de velocidad que merezca notarse, y por la que las respuestas pueden almacenarse en caché durante semanas: la respuesta para un prefijo es la misma para todos los que preguntan. La Comprobación de filtración de contraseñas de este sitio implementa exactamente este modelo, en el navegador, con el hash calculado localmente antes de que se envíe nada.

Qué significa “encontrada N veces” — y qué hacer

Un recuento mayor que cero significa que la contraseña se ha visto en filtraciones esa cantidad de veces, y el número es una medida directa de lo pronto que se probará. Un recuento de millones — la propia “password” se ha visto más de cincuenta millones de veces — significa que la contraseña está entre las primeras conjeturas de cada ejecución de relleno de credenciales, y debe cambiarse en todos los lugares donde se usa, empezando por las cuentas que protegen a las demás: primero el correo, luego la banca, luego las rutas de recuperación de contraseña. Un recuento pequeño no es un aprobado. Incluso una sola aparición significa que la contraseña está en la lista de palabras de un atacante, y suele ser también señal de que sigue un patrón adivinable — el mismo patrón que puso miles de parecidas en el corpus junto a ella.

La solución es la misma con cualquier recuento: sustituye la contraseña por una única que nunca hayas usado en ningún otro sitio, y guárdala en un gestor de contraseñas en lugar de en tu cabeza. La memoria humana es la razón por la que existen las contraseñas reutilizadas — nadie puede recordar cien cadenas aleatorias distintas — y un gestor es la herramienta que hace asequible la unicidad. Genera el reemplazo con el Generador de contraseñas, guárdalo en el gestor, y luego cambia la contraseña en cada servicio donde se usaba la antigua, empezando por los que permitirían a un atacante restablecer los demás. Si la misma contraseña protegía varias cuentas, trata todas como expuestas: los atacantes prueban una contraseña filtrada contra cada servicio que pueden alcanzar, no solo contra aquel del que se filtró.

Qué “no encontrada” no significa

Un recuento de cero es una buena noticia con un límite estricto. Significa que la contraseña no se ha visto en las filtraciones que este corpus conoce — nada más. No significa que la contraseña sea fuerte: una contraseña corta construida con una palabra de diccionario y un dígito puede estar ausente del corpus y aun así caer ante un ataque de adivinación en minutos, porque adivinar no necesita que la contraseña se haya filtrado primero. No significa que la contraseña sea segura: las filtraciones tardan meses o años en salir a la luz, y una contraseña que está en una filtración no denunciada es invisible para todos los corpus hasta el día en que deja de serlo. Y no significa que una contraseña reutilizada esté bien: una contraseña usada en diez sitios está a una filtración de perder los diez, diga lo que diga el recuento de hoy.

La forma honesta de leer un cero es como una prueba superada de varias. La contraseña no se sabe filtrada — eso merece saberse, y es lo único que la comprobación puede decirte. Si además es lo bastante larga, lo bastante aleatoria y se usa en exactamente un lugar es una pregunta aparte, y la comprobación no puede responderla. El estándar que merece mantenerse es el de la guía de secretos memorizados del NIST, enumerada abajo: favorecer la longitud sobre las reglas de complejidad, no exigir nunca cambios periódicos por sí mismos, y comprobar las contraseñas nuevas contra corpus de filtraciones en el momento en que se eligen — que es exactamente la comprobación que describe este artículo. Una contraseña larga, aleatoria, única y no encontrada es una buena contraseña. Quita cualquiera de esas cuatro propiedades y el cero deja de significar gran cosa.

Nunca pegues una contraseña en un chatbot

La forma más peligrosa de preguntar “¿es segura mi contraseña?” es pegar la contraseña en un chatbot o un asistente de IA y preguntárselo directamente. Un chat guarda una transcripción: tu contraseña quedaría almacenada en los servidores de otra persona, conservada según su política de retención, usada para entrenar o ajustar modelos, y posiblemente citada textualmente — en una respuesta posterior, a otra persona por completo. Lo mismo se aplica a cualquier sitio web que te pida escribir una contraseña en su formulario y prometa juzgarla: a menos que la página calcule el hash localmente y te muestre el mecanismo, como hace el comprobador de este sitio, da por hecho que la contraseña se está enviando, almacenando y registrando. Una comprobación de filtraciones merece la pena precisamente porque se puede hacer sin entregar el secreto a nadie — y en el momento en que pegas el secreto en un chat para preguntar por él, has creado la misma exposición que la comprobación existe para detectar.

La regla se generaliza. Las contraseñas, las claves de API, los tokens y las claves privadas son todas cosas que nunca deben escribirse en un chat, un ticket, una publicación en un foro o un documento compartido en forma cruda — razón por la cual este sitio también tiene un Secret Redactor para eliminarlas del texto antes de compartirlo, y un artículo complementario sobre redactar secretos antes de pegarlos. Cuando un secreto debe realmente cambiar de manos, envíalo a través de un gestor de secretos o un enlace de uso único que caduca, en un canal distinto al de la conversación. Y cuando necesites saber si una contraseña se ha filtrado, usa el mecanismo construido para la pregunta: calcula el hash localmente, envía cinco caracteres y compara el resto en tu propio dispositivo. Esa es toda la comprobación, y es la única forma de la pregunta que no se responde a sí misma creando una filtración nueva.

Fuentes y lecturas complementarias

Preguntas frecuentes

¿Es seguro comprobar una contraseña con Have I Been Pwned?

Sí, cuando se hace como lo hace la API de rangos: la contraseña se convierte en hash en tu navegador y solo se envían los primeros 5 caracteres del hash. Have I Been Pwned nunca ve la contraseña ni su hash completo, y no puede saber cuál de los cientos de contraseñas que comparten ese prefijo preguntaste. Nunca pegues una contraseña en un chatbot o en un formulario que la envíe completa para hacer la misma pregunta.

Mi contraseña se encontró en una filtración. ¿Qué cambio primero?

Empieza por las cuentas que protegen a las demás: primero tu correo, porque puede restablecer casi todo lo demás, luego la banca y las rutas de recuperación de contraseña, y después todo lo demás que compartía la contraseña. Genera un reemplazo nuevo y único para cada una con el Generador de contraseñas y guárdalo en un gestor de contraseñas — nunca reutilices la contraseña antigua en ningún sitio, y trata cada cuenta que la compartía como expuesta.

¿Puede una contraseña estar ausente del corpus y aun así ser débil?

Sí. “No encontrada” significa solo que la contraseña no se ha visto en filtraciones conocidas. Una contraseña corta o predecible — una palabra de diccionario más un dígito, un nombre más un año — puede estar ausente del corpus y aun así caer ante la adivinación en minutos. Conserva una contraseña solo si es larga, aleatoria, única para un sitio, y no encontrada.