Ayer saltó la noticia de que circula una colección de 773 millones de pares email-contraseña denominada «Collection #1». Troy Hunt, creador del servicio Have I Been Pwned (HIBP), describía cómo, tras la oportuna limpieza y deduplicación de datos, esta colección añadía unas 20 millones de nuevas contraseñas a HIBP para hacer un total de algo más de 550 millones de contraseñas únicas entre todas las filtraciones que ha ido incorporando con el tiempo.
Al final, parece que esta filtración proviene de muchas fuentes distintas que tienen años de antigüedad, por lo que no habría de qué preocuparse en principio. No obstante, la alarma me ha servido para volver a pasarme por HIBP —un servicio en el que puedes registrar tu email para recibir un aviso si aparece en alguna filtración—, y he podido comprobar que han añadido la muy interesante funcionalidad de buscar contraseñas de manera segura para comprobar si están en su base de datos de filtraciones.
La cosa funciona de la siguiente manera. Cogemos una contraseña que queramos consultar (por ejemplo, 123456) y le pasamos la función hash SHA-1:
SHA1(123456) = 7c4a8d09ca3762af61e59520943dc26494f8941b
En principio, no podemos volver a «123456» a partir de ese churro, pero tampoco sería seguro que sepan que andamos preguntando por ese hash. Así que lo que hacemos es coger los primeros 5 caracteres y se los pasamos a la API de HIBP (así: 7c4a8), y la API nos devuelve todos los hashes que empiezan por esos 5 caracteres (que son muchos, típicamente cientos). Y en esa lista, ya manejable, nosotros podemos comprobar si el resto del hash (en definitiva, la contraseña que queremos consultar) está ahí.
Esto es exactamente lo que hace el formulario online (lo he comprobado), con el JavaScript que tiene detrás, de modo que es seguro utilizarlo.
Si aun así no os fiais, en tres líneas de Bash se puede implementar lo mismo:
#!/bin/bash read -s -p "Password: " PASS; echo PASS=$(echo -n $PASS | sha1sum - | cut -d" " -f1) wget "https://api.pwnedpasswords.com/range/${PASS:0:5}" -q -O - | grep -i "${PASS:5}"
Si ese grep saca algo… malo.
Hice exactamente lo mismo en cuanto salio el «collection 1». Creo que hay una conexión cósmica entre tu y yo, lo noto… Bueno o simplemente se nos ocurrió que era cansado hacer el hash de cada password y comprobarlo dentro de la url, que también puede ser. ^^
¿Para cuando la versión 0.0 de nuestro antivirus homeopático? Aún esta en idea pero no se llegó a implementar. Boiron esta deseoso de darnos dinero…
El antivirus homeopático ya está implementado, ¡y en varios lenguajes, además! Precisamente la implementación más corta es en Bash:
#!/bin/bash