Estoy creando una aplicación con los siguientes requisitos:
- Un cliente inicia sesión con correo electrónico y contraseña. En el servidor,
bcrypt(password)
se calcula y se compara con lo que está almacenado en la base de datos. - Si la autenticación es exitosa, el servidor envía un bloque de datos cifrados que luego serán descifrados en el cliente. (En algún momento en el pasado, el cliente cifró los datos y los envió al servidor).
- La contraseña para los datos cifrados nunca debe enviarse al servidor, por lo que no puedo usar la misma contraseña para la autenticación y el cifrado / descifrado.
Una solución que cumpliría estos requisitos es usar solo dos contraseñas: una para la autenticación y otra para el cifrado / descifrado de los datos. Sin embargo, los usuarios deberán recordar dos contraseñas y podrían mezclarse, enviando accidentalmente la contraseña de descifrado al servidor y violando el tercer requisito.
Una alternativa que requiere solo una contraseña: use la contraseña para el cifrado / descifrado y bcrypt(password)
para la autenticación. De esa manera, la base de datos almacenaría bcrypt(bcrypt(password))
y el servidor nunca manejaría la contraseña de cifrado / descifrado.
¿Es algo razonable de hacer o estoy pasando por alto un problema de seguridad? El tiempo de inicio de sesión / cómputo adicional causado por el cálculo de dos hashes no sería un problema.