Nota bene: Soy consciente de que buena respuesta para asegurar el almacenamiento de contraseñas es scrypt o bcrypt . Esta pregunta no es para implementación en software real, es para mi propia comprensión.
Digamos que a Joe Programmer se le asigna la tarea de almacenar de forma segura las contraseñas de los usuarios finales en una base de datos para una aplicación web; o almacenar contraseñas en el disco para iniciar sesión en un software. Lo más probable es que él:
- Obtenga
$password
del usuario final. - Cree
$nonce
como un valor aleatorio de unos 64 o 128 bits de tamaño. - Cree
$hash = SHA256($nonce$password)
y almacene$nonce
junto con$hash
en la base de datos.
Pregunta uno:
¿Por qué el siguiente no es sustancialmente mejor que el anterior?
- Crea
$long_string
una vez y solo una vez. Almacene esto como una constante en el código de la aplicación.$long_string
podría f.x. tener 2 kilobytes de caracteres aleatorios. - Obtenga
$password
del usuario final. - Cree
$mac = HMAC-SHA256($long_string)[$password]
(es decir, cree un MAC usando la contraseña del usuario final como clave) y almacene este$mac
en la base de datos.
Me imagino que la HMAC tiene los siguientes beneficios:
- ¿Las colisiones son menos frecuentes?
- ¿Es computacionalmente algo más costoso que el hashing simple? (Pero no en ningún lugar cerca de Scrypt, por supuesto).
- Para tener éxito con un ataque de fuerza bruta en un tiempo razonable, y el atacante necesitaría acceder a dos cosas: 1) la base de datos, donde se almacena
$mac
y < em> 2) el código de la aplicación, donde se almacena el$long_string
original. Ese es uno mejor que una función hash, donde el atacante solo necesita acceso a la base de datos.
Pero aún así, nadie parece sugerir el uso de un HMAC, ¿así que debo estar entendiendo mal algo?
Pregunta dos:
¿Cuáles serían las implicaciones de agregar un valor de sal $nonce
?
- Crea
$long_string
una vez y solo una vez. Almacene esto como una constante en el código de la aplicación. - Obtenga
$password
del usuario final. - Cree
$nonce
como un valor aleatorio de aproximadamente 128 bits de tamaño. - Cree
$mac = HMAC-SHA256($long_string)[$nonce$password]
y almacene$nonce
y$mac
en la base de datos.