La aplicación toma varias entradas (en particular, información personal privada) para producir un hash fijo, pero no adivinable.
Ejemplo simplificado:
$data = $websiteDomain . $myChildSchool . $myPetName . $etc;
for ($i = 0; $i < 1000000; ++$i) {
$data = hash('sha512', $data, true);
}
$data = str_replace(['/', '+', '='], '', base64_encode($data));
$result = substr($data, 0, $passwordLength);
El objetivo es crear un código publicado públicamente, que genera hashes que luego se usan como contraseñas. Y la parte importante: las contraseñas se pueden recuperar, utilizando el código público y la información personal privada.
Debido a esto, no puedo usar password_hash()
porque el resultado es automáticamente Salado por lo que produce diferentes hashes cada vez. No puedo proporcionar manualmente un salt ya que está en desuso (produce una advertencia y es probable que se elimine en futuras versiones de PHP).
Mi principal preocupación es que algunas de las contraseñas se podrían usar en sitios web de mierda, que tienen restricciones de longitud máxima pequeñas y que almacenan las contraseñas de los usuarios como texto sin formato. Por lo tanto, asumo que los atacantes podrían robar los datos de hash del sitio web y usar la fuerza bruta para deducir los datos privados.
En el ejemplo anterior, estoy usando SHA-512 con el estiramiento de las teclas. Sin embargo, SHA no está realmente diseñado para esto, las GPU son increíblemente rápidas y pueden existir, ahora o más adelante, técnicas para sortear todas o parte de las iteraciones.
Entonces, ¿qué tan aceptable es la técnica actual? ¿Podría mejorarse, y si es así, cómo? Lo ideal es que la solución no sea específica de PHP y no requiera bibliotecas externas.