Gracias a HIBP y este descargador. Al principio consideré usarlo, pero la API para contraseñas HIBP es muy simple, así que escribí un pequeño script de shell para ello.
Es terriblemente lento porque no tiene ningún paralelismo. Es demasiado lento para mi gusto, así que estoy considerando agregar paralelismo. Fue entonces cuando me topé con la función comodín de URL de curl.
curl es la navaja suiza de las descargas HTTP, admite patrones/comodines y paralelismo masivo, así como casi todos los aspectos de las descargas HTTP (proxy, HTTP1/2/3, todas las versiones SSL/TLS, etc.).
Esta es una única línea de comando curl que descarga toda la biblioteca de hash de contraseñas HIBP al directorio de trabajo actual:
curl -s --remote-name-all --parallel --parallel-max 150 "
En Oracle Cloud VM, siempre libre, esto se completó (para mí) en 13,5 minutos. 😉
comodines de URL y --remote-name-all
Las opciones han existido durante mucho tiempo (es decir, más de una década) y --parallel*
Nuevas opciones agregadas en septiembre de 2019 (v7.66.0).
Por tanto, casi todas las distribuciones de Linux «recientes» ya incluyen una versión de curl que soporta totalmente esta línea de comandos.
Curl es multiplataforma, por ejemplo puedes descargar un versión de Windows también.
Si no tiene suficientes 30-40 GB de espacio libre para almacenar todo el volcado de hash, puede reducir el espacio descargándolo en pequeños lotes y comprimiéndolos inmediatamente.
Este es un comando para olvidarse de todo que puede ejecutar en cualquier PC/servidor con Linux y hará el trabajo de forma masiva:
d="$(date "+%F")"
nohup bash -c 'd="'$d'"; chars=(0 1 2 3 4 5 6 7 8 9 A B C D E F); printf -v joined "%s," "${chars[@]}"; charscomma="${joined%,}"; hibpd="$(pwd)/hibp_${d}"; for c in "${chars[@]}"; do prefix="hibp_${d}_${c}" dir="${hibpd}/${prefix}"; mkdir -p "$dir"; cd "$dir"; date; echo "Starting in $dir with prefix $c ..."; curl -s --remote-name-all --parallel --parallel-max 150 -w "%{url}\n" " cd "$hibpd"; BZIP2=-9 tar cjf "${prefix}.tar.bz2" "$prefix" && rm -r "$prefix"; done; echo "Finished"; date' > "hibp_$d.log" 2>&1 &!
Esto no admite pausar y reanudar las operaciones de descarga (otros descargadores HIBP sí lo hacen), pero como se completa rápidamente (si tiene una conexión de red lo suficientemente buena), no veo ninguna razón para usar esta función.
Puede ensamblar fácilmente las respuestas del servidor en un archivo de aproximadamente 38 GB usando la siguiente línea de comando (en Linux):
find . -type f -print | egrep -ia '/[0-9a-f]{5}$' | xargs -r -d '\n' awk -F: '{ sub(/\r$/,""); print substr(FILENAME, length(FILENAME)-4, 5) $1 ":" $2 }' > hibp_all.txt
Puedes ordenarlo fácilmente según el segundo campo para obtener los hashes más «populares»:
sort -t: -k2 -rn hibp_all.txt | head -n100
Para obtener el valor hash más popular:
sort -t: -k2 -rn hibp_all.txt | head -n100 | cut -d: -f1