¿Cómo se puede combinar el almacenamiento de contraseñas con hash y con sal con una autenticación basada en texto sin formato y sin hash?

8

Mi comprensión es la siguiente:

  1. 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.

  2. 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?

    
pregunta Tim 12.07.2013 - 18:21
fuente

3 respuestas

1

Sí, esto es posible. Aquí se describen dos algoritmos que evitan la necesidad de almacenar equivalentes de texto simple en el servidor (a la vez que permite la autenticación sin la necesidad de enviar una contraseña de texto simple por el cable).

    
respondido por el timoh 13.07.2013 - 00:20
fuente
3

Eche un vistazo al protocolo de contraseña remota segura ( wikipedia , Stanford ). Utiliza un hash de la contraseña (elige tu hash lento, salado favorito) en el lado del cliente, pero el servidor solo obtiene un "verificador" derivado de que hace hash por exponenciación discreta. La autenticación real se realiza mediante un intercambio de claves asimétricas utilizando dos números aleatorios (uno generado por el cliente, uno generado por el servidor), el hash (solo del lado del cliente) y el verificador (del lado del servidor). Se pretende que la clave generada se utilice para cifrar el resto de la sesión, pero simplemente se puede verificar y descartar.

Ventajas:

  • El intercambio de claves en sí mismo es efectivamente una prueba de conocimiento cero, lo que significa que un oyente, un interlocutor, o un impostor del servidor no obtiene información sobre la contraseña. Si estos fueran los únicos tipos de ataques posibles, una contraseña de una sola letra sería suficiente para la seguridad.
  • Un ataque de diccionario en línea (impostor del cliente) puede probar solo una contraseña por intento (las primeras versiones del protocolo permitieron dos).
  • Si un atacante copia la base de datos de los verificadores del servidor, puede ejecutar un ataque de diccionario sin conexión solo ejecutando cada contraseña candidata a través del hash lento y exponentiation. No pueden usar el verificador para hacerse pasar por el cliente.
  • Mientras el verificador del servidor permanezca en secreto, la transacción de intercambio verifica efectivamente el servidor al cliente (así como el cliente al servidor).
respondido por el Gordon Davisson 14.07.2013 - 19:32
fuente
0

Corríjame si me equivoco, pero puede mantener la contraseña de hash en el servidor. por lo que se almacena de forma segura. y usar el nonce como sal para la autentificación. Una cosa importante que veo es que el servidor no necesita conocer la contraseña de texto simple de esta manera. Todavía puede probar que la persona ingresó la contraseña correcta en su extremo, pero comparando hashes, no texto plano. El único lugar donde esta contraseña sería texto sin formato en mi escenario sería la ventana de desplazamiento de la web antes de que se hiciera el hash (dos veces, una vez sin formato y una vez con sal conocida) y luego se enviara por cable no en texto sin formato.

Considere el siguiente escenario

  1. El cliente intenta conectarse
  2. El servidor genera una única fuente
  3. El servidor envía el nonce al cliente. Pica el hachís nuevamente con nonce como sal. un hash que toma el hash de la contraseña como entrada y el nonce como salt.
  4. El cliente hash pwd a través del mismo algoritmo de hash, generando el mismo hash que se almacena en el servidor.
  5. El cliente hace su propio hash individual de la misma manera que el servidor (un hash del hash del pwd con nonce como salt)
  6. El cliente transmite el hash no al servidor.
  7. El servidor lo acepta como correcto para ese tiempo de autenticación y nunca más volvería a aceptar el mismo hash no utilizado
respondido por el PsychoData 12.07.2013 - 20:02
fuente

Lea otras preguntas en las etiquetas