Inicio de sesión: hash de contraseña vs descifrado exitoso

2

El uso de una función unidireccional (por ejemplo, BCrypt) para el manejo de contraseñas en el inicio de sesión basado en contraseña es un enfoque común.

Cuando una aplicación utiliza una clave derivada de la contraseña del usuario para cifrar una clave privada, ¿es seguro confiar en un descifrado exitoso al iniciar sesión?

Ejemplo :

  • Registro (todos los pasos realizados por el cliente):

    1. Derive una clave (A) de la contraseña del usuario (por ejemplo, utilizando PBKDF2 con iteraciones de 100k).
    2. Use la clave A para cifrar la clave privada del usuario (usando cifrado autenticado; por ejemplo, AES en modo GCM).
    3. Almacene la información requerida en el registro de la base de datos del usuario (por ejemplo, texto cifrado, sal, ...).
  • Inicio de sesión (todos los pasos realizados en el lado del cliente):

    1. Cargar el registro de la base de datos del usuario por nombre de usuario.
    2. Derive la clave (B) de la contraseña del usuario (utilizando el mismo método utilizado en el registro).
    3. Intente descifrar la clave privada de los usuarios con la clave B.
pregunta Ratlos 12.01.2018 - 22:57
fuente

1 respuesta

4

Sí, este es un enfoque viable, cuando utiliza el cifrado autenticado, como ha indicado. La etiqueta de autenticación en los datos cifrados es análoga a un hash de contraseña almacenado, y GCM está diseñado específicamente para evitar la falsificación de mensajes (es decir, una etiqueta válida construida sin acceso a la clave privada).

De hecho, GMAC es una variante del modo GCM que está diseñado no para cifrar datos, sino solo para proporcionar una firma con una clave compartida sobre algunos datos.

Es importante tener en cuenta que esto no se debe hacer con cifrados no autenticados, ya que incluso con el relleno utilizado para detectar el descifrado "correcto", esto daría lugar a una probabilidad (ligeramente mejor que) de 1/256 correctamente al tener el relleno correcto a pesar de ser la clave incorrecta.

Dicho todo esto, no creo que esto sea una idea buena , porque es mucho más fácil tener errores de implementación en esto que en un esquema de almacenamiento de contraseña estándar. Atacar este esquema es igualmente fácil / difícil de atacar un hash PBKDF2 separado para la contraseña del usuario, que es un mecanismo de autenticación bien estudiado. Si le preocupa el tiempo de CPU con la computación de dos hash PBKDF2, puede hacer lo siguiente:

  1. Calcular key = PBKDF2(Password, Salt, N) para derivar la clave simétrica.
  2. Calcular pwhash = PBKDF2(Password, Salt, N+1) para obtener el hash de contraseña almacenado. (Esto se puede hacer con solo una ronda adicional en el hash original anterior.)

Invertir PBKDF2(Password, Salt, N+1) en PBKDF2(Password, Salt, N) es equivalente a invertir HMAC en cualquier función hash que uses.

El esquema anterior es el esquema utilizado por Lastpass para la autenticación frente al descifrado de su bóveda de contraseñas. (Solo se envía pwhash a su servidor, por lo que no pueden recuperar la clave para la bóveda de contraseñas de eso).

    
respondido por el David 12.01.2018 - 23:28
fuente

Lea otras preguntas en las etiquetas