it-swarm.it

Gli algoritmi di hash delle password più sicuri?

Quali sono/sono attualmente gli algoritmi di hashing più crittograficamente sicuri? ( disponibile in PHP )

La velocità è irrilevante, perché sto ripetendo l'hash su un tempo fisso (anziché un numero fisso di iterazioni). Quello che mi interessa è la forza matematica.

La mia intuizione mi dice che è idromassaggio , essendo il più grande e il più lento del gruppo. Quello o SHA-512. Ma dove posso vedere cosa consigliano gli esperti in rete?

41
Core Xii

I crittografi potrebbero sottolineare che, quando leggi la stampa fine, non vi è alcuna prova che esistano effettivamente funzioni di hash sicure. L'unica cosa che abbiamo ora sono candidati per i quali non è stata ancora trovata alcuna debolezza.

Quindi il meglio che puoi sperare è una funzione che è sopravvissuta al controllo di molti crittografi per lungo tempo. Inoltre, è necessario che abbia un output sufficientemente ampio (256 bit sono sufficienti se si desidera ottenere una "sicurezza a 128 bit" e andare oltre ha poco senso). In questo momento, a partire dall'estate 2011, questo indica SHA-256 o SHA-512, non Whirlpool.

Basare il conteggio dell'iterazione sul tempo impiegato da una macchina tipica è una buona idea - ma basarlo sul tempo che davvero impiega il tuo macchina è non una buona idea. Altrimenti, potresti finire con conteggi di iterazione bassi per alcune password perché la macchina stava gestendo molte richieste in quell'istante (una situazione che un attaccante potrebbe forzare, a proposito). L'uso di molte iterazioni ha lo scopo di contrastare gli aggressori rallentando l'hash della password l'attaccante computer - che rallenta anche il sistema è un sottoprodotto sfortunato; ma il vero bersaglio è qualunque sia la potenza della macchina che l'attaccante potrebbe raccogliere. Dato che non puoi davvero fare benchmark sulla macchina dell'attaccante, devi ricorrere a stime approssimative, quindi un conteggio fisso, il più alto possibile finché il carico medio è tollerabile sul tuo sistema (l'importante parola qui è "media", che squalifica una misura dinamica mentre si intende eseguire).

Inoltre, la macchina dell'attaccante non deve assomigliare alla tua; può essere, ad esempio, un GPU o un FPGA , che offre un calcolo distinto abilità da ciò che puoi ottenere su un tipico server. Volete una funzione per la quale un utente malintenzionato non sarà in grado di ottenere enormi miglioramenti delle prestazioni utilizzando hardware non PC. Anche in questo caso, questo promuove SHA-256 o SHA-512, che sono pensati per l'efficienza della CPU (con operazioni aritmetiche a 32 o 64 bit), non Whirlpool, che può beneficiare di ottimizzazioni hardware simili a quelle per cui AES è stato progettato.

Infine, le iterazioni sono solo una parte del lavoro; hai anche bisogno di un sale abbastanza lungo, unico abbastanza. Iterazioni e salatura possono essere un po 'difficili da fare allo stesso tempo; sei caldamente incoraggiato a usare una costruzione standard come PBKDF2 (sebbene fosse inteso come una funzione di derivazione chiave, non come un codice di password, PBKDF2 risulta ragionevolmente bravo anche in questo).

33
Thomas Pornin

Dal commento di OP:

"Sicuro" come in, basato su un problema matematico che non ha una soluzione rapida nota. "Più sicuro" come in, basato sul più complesso di tali problemi. Un algoritmo di hashing è considerato "forte" quando romperlo richiederebbe un importante contributo alla crittografia/matematica.

Sembra che tu abbia letto "Basta con i tavoli arcobaleno: quello che devi sapere sugli schemi di password sicure" di Thomas Ptacek , e ora ti stai chiedendo quale hash crittografico moderno ottimizzato per l'archiviazione delle password è considerato "il più sicuro".

Non penso che ci sia una risposta chiara. Per quanto ne so, alcuni dei preferiti della comunità di programmazione (scrypt & bcrypt) non sono stati rigorosamente sottoposti a peer review come funzioni di hashing delle password. Almeno, non sono stati sottoposti a revisione paritaria da parte di un gran numero di crittografi paragonabili a come vengono controllati voci della competizione della funzione hash NIST .

Detto questo, l'attuale consenso di Hacker News è che l'ordine è:

  1. scrypt . Poiché richiede sia memoria che CPU, si ritiene che scrypt abbia il margine di sicurezza più elevato degli hash delle password correnti . Puoi vedi di più sul suo design qui .
  2. bcrypt era il campione precedente, come menzionato in post sul blog di Thomas Ptacek sopra .
  3. PBKDF2 e più round di SHA2 (fx nix Crypt con SHA256 ) sono considerati i migliori tre (quale di questi è "migliore" dipende in gran parte dal numero di iterazioni Usato).

(Notare che "Hacker News" è principalmente una comunità di programmazione, e non come potrebbe suggerire il nome ad una comunità di specialisti della sicurezza (anche se alcuni di loro vanno in giro anche lì).)

Se ti guardi intorno su questo sito, sotto i tag crittografiapassword e hashing tag fx, vedrai che di solito non esiste un singolo l'hash della password "migliore" menzionato. Immagino che ciò sia in parte dovuto al fatto che i veri crittografi non hanno un chiaro consenso su quale sia il più "forte", a causa della revisione dei pari relativamente limitata.

Ecco un discreto paragone uniforme e di facile lettura (che non include scrypt, presumibilmente perché è ancora troppo nuovo).

La velocità è irrilevante, perché sto ripetendo l'hash su un tempo fisso (piuttosto che un numero fisso di iterazioni).

Con alcuni di questi hash, non puoi davvero farlo. Fornisci un "fattore di lavoro" quando chiami la libreria e la biblioteca si occupa di tutto il resto.

20
Jesper M

CRYPT_BLOWFISH (OpenBSD bcrypt, basato sulla cifra simmetrica blowfish, ma è un vero algoritmo di hashing, sembra esserci molta confusione su questo) e CRYPT_SHA512 sono i migliori. Entrambi offrono la possibilità di ridimensionare il numero di "round" utilizzati, consentendo di scegliere un compromesso di sicurezza/prestazioni.

Ad esempio, il numero predefinito di round per il pesce palla è 7 (l'intervallo di valori è 4-31). Questo valore è logaritmico, quindi ogni aumento comporta l'esecuzione dell'algoritmo 10 volte di più. Un valore di 13, impiega quasi 1 minuto per hash su un Core2Duo 2.4ghz

L'ottimizzazione del livello quanto più tollerabile è la prestazione, si tradurrà nella massima sicurezza.

nota: recentemente è stato trovato un bug in alcune implementazioni di bcrypt e, come tale, potresti voler usare SHA-512.

Nota: SHA-512 è più veloce da calcolare rispetto a SHA-256 su processori a 64 bit (specialmente se ottimizzato con SSE2_64. In particolare, dovresti considerare questo e usare round aggiuntivi per assicurarti che gli hash siano abbastanza forti per il loro scopo.

L'applicazione open source hashkill , ha pubblicato alcuni parametri di riferimento relativi alla velocità con cui le GPU moderne potrebbero superare i moderni algoritmi di hashing. In particolare, un Radeon HD 6990 può fare: 11001 Megahashes/sec di MD5 dritto (CRYPT_MD5 è salato e l'implementazione di FreeBSD usa 100 round). Straight SHA1 a 3444 Megahashes/s.

7
Allan Jude

Ti consiglio di usare phpass

Questo è un framework di hashing della password di dominio pubblico portatile per l'uso in PHP. È pensato per funzionare con PHP 3 e versioni successive, ed è stato effettivamente testato con almeno PHP da 3.0.18 a 5.3.0 finora.

Il metodo di hashing preferito (più sicuro) supportato da phpass è il bcrypt basato su Blowfish in stile OpenBSD, supportato anche con il nostro pacchetto crypt_blowfish di dominio pubblico (per applicazioni C) e noto in PHP come CRYPT_BLOWFISH , con un fallback agli hash basati su DES estesi basati su BSDI, noto in PHP come CRYPT_EXT_DES, e un fallback di ultima istanza agli hash con password salati e con iterazione basata su MD5 implementati nello stesso phpass ( noto anche come hash portatile).

Come dice il sito web, bcrypt basato su Blowfish è l'hashing più sicuro. Credo che questo sia vero perché è " prova della legge di Moore " mentre la maggior parte degli altri non lo sono.

0
Alfred