MD5 antes de PBKDF2 en software heredado

0

Mantengo un software heredado que utiliza MD5 de la siguiente manera:

  1. El cliente solicita una sal de 16 bytes al autenticar una cuenta.
  2. El servidor genera un salto de 16 bytes, lo vincula a la cuenta y lo envía de vuelta al cliente.
  3. El cliente agrega el salt de 16 bytes en una contraseña, hace MD5 (pass + salt) y envía el hash MD5 a través de la red.
  4. A medida que el servidor almacena la contraseña de texto sin formato en la base de datos, solo recupera la contraseña y compara MD5 (database_pass + salt) con el MD5 recibido (pass + salt) del cliente.

Como no puedo cambiar el funcionamiento del cliente, estaba pensando en qué podría hacer para dejar de almacenar la contraseña de texto sin formato en la base de datos. La idea con la que vine fue, en lugar de almacenar la contraseña de texto sin formato en la base de datos, almacenar la sal de 16 bytes utilizada por el cliente y, en el registro, generar el MD5 (pass + salt) y utilizar este MD5 como entrada para PBKDF2 con un sal de 64 bytes y HMAC-SHA512, 10000 iteraciones. Luego, para autenticarme, recibiría el MD5 (pase + sal) del cliente y PBKDF2 para verificar con el hash PBKDF2 almacenado.

Mi duda es, ¿esto hará que mi servidor sea más seguro? Como la contraseña y el MD5 (pass + salt) no se almacenarán en la base de datos, no se podrá acceder a la contraseña si mi base de datos presenta pérdidas, pero ¿hay algún problema con el uso de MD5 antes?

¿Hay algún problema posible con este enfoque? ¿Hay un mejor enfoque?

El único inconveniente que se me ocurre es que no tendré acceso a la contraseña del cliente después de una autenticación exitosa, por lo que cambiar el sistema de autenticación más tarde será difícil. Tendré el MD5 (pase + sal), pero luego sería imposible cambiar la sal.

Quiero hacer esto correctamente porque no podré cambiar el sistema más adelante. Cualquier ayuda es apreciada.

    
pregunta RenatoUtsch 09.03.2015 - 04:13
fuente

1 respuesta

1

Creo que hay un error grave en tu sugerencia: a menos que me olvide de mi marca, tu " sal "no es una sal en absoluto: es un desafío y, como tal, debería se generará aleatoriamente cada vez que un cliente intente autenticarse.

Si este es el caso, entonces no puede usarlo como entrada para la función pbkdf2. Simplemente no funcionará. Si no es no el caso, entonces, a menos que ya esté utilizando una conexión segura entre el cliente y el servidor, su esquema de autenticación es muy defectuoso: es vulnerable a un ataque de repetición y se aspira tanto como una contraseña de texto simple.

En general, siempre es mejor no intentar implementar este tipo de esquema: use una conexión segura (TLS) entre el cliente y el servidor para proteger los datos en movimiento y use PBKDF2 (o cualquier estándar key-derivation function que coincida con su requisito: BCRYPT , SCRYPT , etc.) para proteger los datos en reposo. Si realmente necesita respuesta-desafío, use SCRAM .

En su caso, desafortunadamente, la implementación de SCRAM requeriría un cambio en la forma en que funciona el cliente.

La mejor alternativa sería que usted almacene la contraseña en forma cifrada (reversiblemente). Sin embargo, proteger las claves adecuadamente es una tarea muy compleja: difícil de hacer bien y fácil de hacer mal. Es difícil hacer sugerencias para este tipo de implementación, ya que depende mucho del valor de los activos que está protegiendo (sin embargo, sugeriría que considere mover la autenticación a un sistema completamente diferente que solo interactúe con el principal a través de una interfaz estricta)

    
respondido por el Stephane 09.03.2015 - 11:12
fuente

Lea otras preguntas en las etiquetas