Mi comprensión es la siguiente:
-
Para almacenar de forma segura una contraseña (por ejemplo, en una base de datos), utiliza un algoritmo de hashing diseñado para este propósito (diseñado para ser lento, por ejemplo, bcrypt), y utiliza un salt único para cada contraseña. Esto hace que sea difícil / lento para un atacante con acceso a la base de datos recuperar las contraseñas, porque no pueden usar una tabla de arco iris, y cada intento de fuerza bruta toma más tiempo que un simple md5 o sha1.
-
Para autenticar de forma segura una contraseña sobre un protocolo de texto sin formato (es decir, no SSL), el servidor envía un nonce al cliente, y el cliente combina la contraseña y el nonce (y quizás también una marca de tiempo), ejecuta una Algoritmo de hash en ellos, y transmite ese hash al servidor, que ejecuta el mismo algoritmo y compara. Esto evita enviar la contraseña en texto sin formato, y también hace que los ataques de reproducción sean imposibles, siempre que no se pueda engañar al servidor para que acepte el mismo nonce dos veces.
El problema es que, para la parte de autenticación de esto, el servidor debe conocer la contraseña de texto simple real. Por lo tanto, no puede almacenarlos de manera segura como en # 1.
Ahora, el servidor podría transmitir el Salt al cliente, y el cliente podría calcular primero la contraseña con sal y hash y luego hacer el # 2. Pero entonces, la contraseña con hasted-hashed se convierte efectivamente en la contraseña de texto simple, y por lo tanto, aún no tienes el # 1.
Entonces, mi pregunta es, ¿hay alguna manera de hacer el # 1 y el # 2?