Sto scrivendo un'applicazione Java necessaria per autenticare localmente un utente con una password e quindi utilizzare la password per generare una chiave AES-256 per la crittografia / decrittografia dei file locali.
Comprendo i principi alla base di tutto e quanto sia importante la scelta dell'algoritmo corretto, cicli di hashing e generazione di sale criptovalori. Con questo in mente, utilizzo l'algoritmo PBKDF2WithHmacSHA256 supportato in Java 8, un valore salt di 16 byte generato con SecureRandom di Java e 250.000 cicli di hashing. La mia domanda si trova nell'implementazione, la seguente è una versione (semplificata) di come generi l'hash e la chiave degli utenti. Il codice è stato abbreviato per il bene di questo post e i valori sono stati codificati per una volta, semplificazione del post.
int iterations = 250000;
String password = "password";
String salt = "salt";
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
char[] passwordChars = password.toCharArray();
KeySpec spec = new PBEKeySpec(passwordChars, salt.getBytes(), iterations, 256);
SecretKey key = factory.generateSecret(spec);
byte[] passwordHash = key.getEncoded();
SecretKey secret = new SecretKeySpec(key.getEncoded(), "AES");
Questo codice è basato sulla concatenazione di alcuni diversi progetti Java open source che ho utilizzato che sfruttano anche l'algoritmo PBKDF2 per l'hashing della password, la generazione di chiavi AES o entrambi.
La mia domanda qui è, questo è effettivamente sicuro? Ho la sensazione che l'uso della stessa "chiave" del valore SecretKey per generare il "segreto" SecretKey e generare l'hash non sia corretto. Se questo è vero, chiunque può consigliare il metodo corretto per sfruttare l'algoritmo PBKDF2WithHmacSHA512 per generare un hash della password e derivare un tasto AES?