Migliora l'hashing della password con un sale random

Sto avviando un sito Web e sto cercando di decidere come crittografare le password degli utenti per memorizzarle in un database SQL.

Mi rendo conto che l'utilizzo di un semplice md5 (password) non è molto sicuro. Sto prendendo in considerazione l'utilizzo di un sha512 (password.salt), e ho cercato il modo migliore per generare un sale utile. Ho letto numerosi articoli affermando che un sale dovrebbe essere il più random ansible per aggiungere entropia all'hash e sembra una grande idea. Ma:

  • è necessario memorizzare il sale random insieme al tuo hash
  • dato che un utente malintenzionato in qualche modo ha accesso alle tue password con hash (e sta cercando di invertire l'hash in text normale), significa che probabilmente ha scaricato il tuo database, quindi ha avuto accesso ai tuoi sali casuali anche

Non è ovvio che il valore dell'aspetto strano accanto all'hash nel database sia salato? Se l'attaccante può accedere al sale insieme al valore hash, come è più sicuro?

Qualcuno ha qualche esperienza in quella zona? Grazie!

"Un utente malintenzionato è " autorizzato " a conoscere il sale – la sicurezza deve essere progettata in modo tale che anche con la conoscenza del sale è ancora sicuro.

Cosa fa il sale?

Il sale aiuta a difendersi dagli attacchi di forza bruta usando "tavoli arcobaleno" precompilati.
Il sale rende la forza bruta molto più costosa (in termini di tempo / memory) per l'aggressore.
Il calcolo di una tabella di questo tipo è costoso e solitamente viene eseguito solo quando può essere utilizzato per più di un attacco / password.
Se si utilizza lo stesso salt per tutte le password, un utente malintenzionato potrebbe precalcolare una tabella di questo tipo e quindi eseguire la brute-force delle password in chiaro …
Finché si genera un nuovo salt (random cryptogrpahically strong) per each password che si desidera memorizzare l'hash di non c'è alcun problema.

SE vuoi rafforzare ulteriormente la sicurezza
Potresti calcolare l'hash più volte (hash hash, ecc.) – questo non ti costa molto ma rende un attacco a forza bruta / calcolando "tavoli arcobaleno" ancora più costosi … per favore non inventarti – ci sono methods standard comprovati per farlo, vedi per esempio http://en.wikipedia.org/wiki/PBKDF2 e http://www.itnewb.com/tutorial/Encrypting-Passwords-with-PHP-for-Storage -Utilizzo-the-RSA-PBKDF2-standard

NOTA:

L'utilizzo di un meccanismo del genere è in questi giorni mandatrix poiché "CPU time" (utilizzabile per attacchi come rainbow tables / brute force ecc.) Sta diventando sempre più ampiamente disponibile (si veda ad esempio il fatto che il servizio Cloud di Amazon è tra i primi 50 del più veloce supercomuter in tutto il mondo e può essere utilizzato da chiunque per una quantità relativamente piccola)!

dato che un utente malintenzionato in qualche modo ha accesso alle tue password con hash (e sta cercando di invertire l'hash in text normale), significa che probabilmente ha scaricato il tuo database, quindi ha avuto accesso ai tuoi sali casuali anche

L'integer punto di salagione è quello di sconfiggere "tavoli arcobaleno":

http://en.wikipedia.org/wiki/Rainbow_table

Scopri perché un sale sufficientemente lungo sconfigge qualsiasi tavolo arcobaleno nella sezione "Difesa contro le tavole arcobaleno" .

come è più sicuro?

In passato era più sicuro perché costringeva l'attaccante a provare un approccio a forza bruta molto costoso, invece che un istantaneo guardato nelle tabelle arcobaleno precalcolate. Se avevi un sale a 64 bit, l'attaccante whereva avere 2 ^ 64 tabelle arcobaleno pre-calcolate invece di una … In altre parole: rendeva inutili le tavole arcobaleno.

Si noti tuttavia che le moderne GPU possono incrinare miliardi di password al secondo, il che rende quasi inutile per un utente malintenzionato memorizzare enormi tabelle arcobaleno (invece di memorizzare miliardi di hash, è sufficiente calcolarle in pochi secondi).

Al giorno d'oggi vuoi memorizzare le tue "password" usando qualcosa come PBKDF2 o scrypt.

La forza delle tue password hashed e salate si basa su tutti i seguenti fattori:

  • La forza dell'algorithm di hashing
  • La casualità del sale
  • La casualità della password

Il tuo sistema è forte quanto il più debole di quanto sopra.

Le domande seguenti sono tratte dal sito affiliato Security StackExchange . Discutono di hashing, sali, PBKDF2, bcrypt, scrypt e alcune altre cose.

  • Come password di hash in modo sicuro?
  • Gli esperti di sicurezza consigliano bcrypt per l'archiviazione della password?

C'è anche qualche discussione precedente da qui su StackOverflow:

BCrypt è un buon algorithm di hashing da utilizzare in C #? Dove posso trovarlo?

In breve risposta alla domanda, un sale è una salvaguardia che ci mette molto tempo a recuperare una password in caso di compromissione proprio come un hash. Se stai attaccando una password, il sale non farà la differenza. Se si tenta di utilizzare un dictionary pre-calcolato o di testare più password contemporaneamente, avere un sale diverso per ciascuna voce aumenterà notevolmente la quantità di lavoro necessario e in genere rende imansible generare una tabella arcobaleno adatta.

Ecco un buon articolo sulla crittografia: http://www.javacodegeeks.com/2012/02/introduction-to-strong-cryptography-p1.html

Vedi la sezione Uso del mondo reale degli algoritmi di hash, scenario 1 per la discussione del sale.

Consiglio vivamente di utilizzare http://docs.oracle.com/javase/6/docs/api/java/security/SecureRandom.html per generare il tuo sale