Sto lavorando a un progetto privato in cui ho bisogno di memorizzare i dati finanziari di un utente in un database. Cripteremo questi dati usando AES, e userò scrypt per generare una chiave di crittografia AES da una password utente più semplice.
Desidero anche essere in grado di comunicare all'utente se sta utilizzando la password corretta durante l'accesso. La velocità non è un problema: il programma verrà eseguito sul dispositivo dell'utente e non su un server multi-utente.
Quindi riassumendo: voglio utilizzare una sola password per crittografare i dati e autenticare gli utenti.
Posso vedere due opzioni per fare ciò:
-
Genera un hash SHA-256 dall'output di scrypt, archivia l'hash in StoredHash e controlla se SHA256 (scrypt ("password fornita")) == StoredHash.
-
Encrypt the scrypt-output della password usando AES in EncryptedScryptOutput usando scrypt-output come chiave e memorizzalo, e controlla se scrypt ("password fornita") == AESdescrypt (decryptionKey = scrypt ("fornito password "), EncryptedScryptOutput).
I (penso che io :-) sono consapevole del modo in cui questo dovrebbe essere fatto, usando sali e / o vettori iniziali. Le mie domande sono: ho corretto che entrambe le versioni saranno sicure? Diresti che una opzione è migliore dell'altra e perché?
Grazie!