Estoy trabajando en un proyecto privado donde necesito almacenar los datos financieros de un usuario en una base de datos. Cifraré estos datos usando AES, y usaré scrypt para generar una clave de cifrado AES a partir de una contraseña de usuario más simple.
También quiero poder decirle al usuario si está usando la contraseña correcta al iniciar sesión. La velocidad no es un problema: el programa se ejecutará en el dispositivo del usuario y no en un servidor multiusuario.
Resumiendo: quiero usar una contraseña para cifrar los datos y autenticar a los usuarios.
Puedo ver dos opciones para hacer esto:
-
Genere un hash SHA-256 a partir de la salida de scrypt, almacene el hash en StoredHash y verifique si SHA256 (scrypt ("contraseña suministrada")) == StoredHash.
-
Cifre la salida scrypt de la contraseña usando AES en EncryptedScryptOutput usando la salida scrypt como la clave y guárdela, y verifique si scrypt ("contraseña suministrada") == AESdescrypt (decryptionKey = scrypt ("suministrado contraseña "), EncryptedScryptOutput).
Yo (creo que :-) soy consciente de la manera técnica en que se debe hacer esto, utilizando sales y / o vectores iniciales. Mis preguntas son: ¿Estoy seguro de que ambas versiones serán seguras? ¿Diría que una opción es mejor que la otra y por qué?
¡Gracias!