Estoy desarrollando un programa que necesita usuarios para iniciar sesión. El tráfico no es sensible pero tiene que viajar lo más rápido posible, por lo tanto no estoy asegurando la conexión a través de TLS o algo así. Lo único sensible es la contraseña y probablemente el nombre de usuario (que será la dirección de correo electrónico). Antes de transferirla o de cifrarla con una clave pública RSA, pensé en eliminar la contraseña en el lado del cliente, el problema es que, si un atacante puede obtener este hash o contraseña encriptada, puede iniciar sesión fácilmente usando este hash directamente si modifica el hash. Cliente, así que necesito algún tipo de salazón. El problema es que: el servidor almacenará la contraseña con sal + hash, por lo que cuando el cliente haga la contraseña con un salt diferente cada vez, producirá un hash diferente. Con el cifrado, el servidor solo puede descifrar la contraseña + sal y eliminar la sal. Ahora me pregunto si hay una manera sin cifrado, solo con hash, de que pueda transportar mi contraseña de forma segura al servidor y prohíba que un atacante simplemente reutilice la contraseña hash ?
Mis pensamientos:
El servidor almacena la contraseña con salt1
, hash. El servidor envía salt1
y aleatoriamente (cada conexión una nueva) salt2
al cliente. El cliente salta y hashs la contraseña con salt1
, sales y hashs el hash desde el paso 1 nuevamente con salt2
, envía este hash al servidor. Entonces, para verificar la contraseña que el servidor tiene para saltear y hash, se almacena el hash con salt2
y ver si hay igualdad. ¿Esto es seguro?