Capire l'hashing delle password salate utilizzando Java

2

Contesto:

Sto utilizzando questo tutorial e sto cercando di capire e implementare l'hashing delle password salate usando Java. Dopo aver trascorso un po 'di tempo su questo argomento, ho capito che l'idea di base è:

  1. Converti la stringa della password in un array di caratteri.
  2. Genera un sale casuale usando SecureRandom (o simile)
  3. Hash l'array di caratteri della password con una funzione di hash crittografica standard.
  4. Converti gli array di byte salini e hash alle rispettive stringhe esadecimali.
  5. Prependi hexedSalt a hexedHash e salva la stringa risultante insieme a hexedSalt nel database.

Domande:

  • Qual è il punto in cui prependi il metodo costante da PBKDF2_ITERATIONS a createHash(char[] password) ?
  • La mia comprensione dell'intero processo è corretta?
  • Ecco il link al mio codice sorgente - quale valore dovrei salvare come hash e quale valore come sale?
posta Sandeep Chatterjee 11.06.2015 - 22:18
fonte

2 risposte

4

PBKDF2 è un funzione di hashing della password (*); usa un numero configurabile di iterazioni (per renderlo il più lento possibile) e un sale (per dissuadere ogni tipo di parallelismo negli attacchi). Per verificare una password, l'hash viene ricalcolato e dovrebbe fornire lo stesso valore. Per eseguire questo ricalcalo, è necessario utilizzare lo stesso numero di iterazioni e lo stesso valore di sale; altrimenti otterrai un output distinto e non ne saprai di più.

Per ogni nuova password registrata viene generato un nuovo salt (ad es. ogni volta che viene creato un nuovo account utente e anche ogni volta che un utente cambia la sua password), quindi deve essere memorizzato insieme al valore hash.

Il conteggio delle iterazioni dovrebbe anche essere memorizzato, perché potrebbe essere modificato in qualche punto. Nel codice a cui si fa riferimento, il conteggio è una costante ( static final ), ma il suo ruolo concettuale è quello di contrastare l'aumento delle prestazioni dei computer nel tempo: si utilizza il numero di iterazioni per rendere ciascuna hashing della password lento come si può tollerare, perché renderà anche lento per l'attaccante. Quando acquisti un nuovo server più veloce, potresti voler aumentare il conteggio delle iterazioni (ad esempio modificando il codice sorgente e ricompilando l'applicazione, con un conteggio maggiore). Tuttavia, in questo caso, non si desidera invalidare le password hash memorizzate esistenti. Pertanto, è necessario sapere, per ogni hash memorizzato, quante iterazioni sono state utilizzate per quel determinato hash. Questo è il motivo per cui il conteggio delle iterazioni viene memorizzato insieme al valore salt e al valore hash stesso.

(*) In senso stretto, una funzione di derivazione della chiave basata su password, ma manteniamo le cose semplici.

    
risposta data 11.06.2015 - 22:50
fonte
2

L'hashing della password di base con i sali coinvolge solo la password e un sale casuale che vengono uniti insieme prima di creare l'hash. Non menzioni quel processo di iscrizione nella tua spiegazione ed è importante perché altrimenti il sale non aggiunge alcuna sicurezza.

L'esempio a cui ti sei collegato utilizza un tipo di hashing della password più avanzato che utilizza PBKDF2 che ha anche un conteggio delle iterazioni (numero di volte per ripetere il processo di hashing). Ciò si riflette nel loro codice con

byte[] hash = pbkdf2(password, salt, PBKDF2_ITERATIONS, HASH_BYTE_SIZE);

Quindi devono memorizzare il conteggio delle iterazioni, il sale e l'hash della password finale da utilizzare quando si ricalcola un hash per scopi di confronto delle password. Se hai intenzione di implementare questo esempio, dovrai memorizzare gli stessi dati.

    
risposta data 11.06.2015 - 22:49
fonte

Leggi altre domande sui tag