2013-02-07 3 views
6

Io sono lo sviluppatore di un nuovo sito Web costruito in PHP e mi chiedo quale sia esattamente la cosa migliore da usare per l'hashing . Ho guardato md5 e sha1 ma c'è qualcosa di più sicuro.
Mi dispiace se si tratta di una domanda sgradevole, ma sono nuovo a PHP Security e sto cercando di rendere il mio sito il più sicuro possibile. Inoltre, cos'è un sale?
Grazie,
WaseemPHP - MD5, SHA, Hashing security

+1

Per che cosa utilizzerai l'hash? Per quanto riguarda il sale, consultare http://en.wikipedia.org/wiki/Salt_(cryptography) –

+0

Password e nomi utente –

+0

Suggerimento: 'bcrypt' - questo è tutto. – Leigh

risposta

9

Prima di tutto MD5 e SHA1 hanno dimostrato di essere vunrable a attacchi di collisione e possono essere arcobaleno presentato facilmente (Quando vedono se si hash è lo stesso nel loro database di password comuni).
Attualmente ci sono due cose che sono abbastanza sicure per le password, che è possibile utilizzare.
Il primo è sha512. sha512 è una sottovoce di SHA2. SHA2 non è stato ancora dimostrato essere vunrable agli attacchi di collisione e sha512 genererà un hash di 512 bit. Ecco un esempio di come utilizzare sha512:

<?php 
hash('sha512',$password); 

L'altra opzione è denominata bcrypt. bcrypt è famoso per i suoi hash sicuri. Il suo probabilmente il più sicuro là fuori e anche uno più personalizzabile.
prima che si desidera iniziare a utilizzare bcrypt è necessario controllare se il tuo sever ha attivato, Enter questo codice:

<?php 
if (defined("CRYPT_BLOWFISH") && CRYPT_BLOWFISH) { 
    echo "CRYPT_BLOWFISH is enabled!"; 
}else { 
echo "CRYPT_BLOWFISH is not available"; 
} 

Se restituisce che sia abilitata allora il passo successivo è facile, Tutto quello che devi fare per bcrypt un password è (Nota per più di personalizzazione è necessario vedere questo How do you use bcrypt for hashing passwords in PHP?):

crypt($password, $salt); 

Ora per rispondere alla tua seconda domanda. Un salt è usualmente una stringa casuale che aggiungi alla fine di tutte le password quando le hai cancellate. L'uso di sale significa che se qualcuno ottiene il tuo database non può controllare gli hash per le password comuni. Il controllo del database viene chiamato utilizzando una tabella arcobaleno. Dovresti sempre usare un sale per l'hashing !!

Qui sono le mie prove per la SHA1 e MD5 vulnerabilità di attacco di collisione:
http://www.schneier.com/blog/archives/2012/10/when_will_we_se.html, http://eprint.iacr.org/2010/413.pdf, http://people.csail.mit.edu/yiqun/SHA1AttackProceedingVersion.pdf, http://conf.isi.qut.edu.au/auscert/proceedings/2006/gauravaram06collision.pdf e Understanding sha-1 collision weakness

+4

Solo per la cronaca: bcrypt è famoso per _non_ essere veloce ma molto lento (http://codahale.com/how-to-safely-store-a-password/). – ckruse

+0

Ottima risposta !!! – Mez

+0

@ckruse Scusate per l'errore lo aggiusterò :) – C1D

1

Lo scopo del sale è quello di rallentare un attaccante dal confronto un elenco di pre - hash generati contro l'hash di destinazione.

Invece di dover pre-calcolare un valore "hash" per ogni password di testo in chiaro, un utente malintenzionato deve precomputare 16384 valori "hash" per ciascuna password in chiaro (2^7 * 2^7).

Oggi è un po 'troppo grande quando la funzione crypt è stata sviluppata per la prima volta: il potere computazionale di precomputerare molte password per il numero di password in chiaro che si sospettano (dizionario) era piuttosto elevato.

Non così tanto oggi che è il motivo per cui abbiamo cose come password shadow, altre funzioni di password di base oltre a crypt e ogni sysad che vuole che tu scelga una password che non si visualizzi in un dizionario.

Se gli hash che si desidera generare sono per password, questo è un metodo ben accettato di implementazione.

http://www.openwall.com/phpass/

+0

Grazie per le informazioni! –

+0

Non ho idea di come hai ottenuto il numero 16384 e la salatura è più importante che mai. Quando si combina ciascuna password con una differenza diversa, un utente malintenzionato dovrebbe creare una tabella arcobaleno per ogni singola password e non può utilizzare 1 tavolo arcobaleno per ottenere tutte le password. Questo è lo scopo del sale, non è un segreto e non aiuterà contro gli attacchi del dizionario. – martinstoeckli

+0

@martinstoeckli - Penso che Danilo stava assumendo due caratteri ASCII a 7 bit come sale, quindi 16.384 possibilità. E penso che voi ragazzi "parlate l'un l'altro", cioè, penso che entrambi stiate dicendo la stessa cosa. Invece di una tabella arcobaleno per le password "n", ora sono le voci 16K per ciascuna delle "n" password (o, concettualmente, una matrice x "n" 16K ora, invece di una matrice di elementi "n"). – Dan

0

Se hai intenzione di fare questo per le password, quindi non utilizzare MD5 o SHA1. Sono noti per essere deboli e insicuri, anche con il sale.

Se li si utilizza per altri scopi (ad esempio fornire un hash di un file per confermarne l'autenticità o una colonna di database hash casuale per fornire un ordinamento pseudo-casuale), allora vanno bene (fino a un punto), ma non per le password o qualsiasi altra cosa che si ritenga debba essere tenuta al sicuro.

L'attuale algoritmo di best practice per il blocco delle password è BCrypt, con salatura adatta.

E il modo migliore per implementare l'hashing della password di BCrypt in PHP è utilizzare la nuova API password di PHP. Questa API apparirà come una serie di funzioni integrate nella prossima versione di PHP, v5.5, prevista per il rilascio nei prossimi mesi. La buona notizia è che hanno anche rilasciato una versione retrocompatibile per gli utenti delle versioni correnti di PHP (5.3 e 5.4), quindi anche se PHP 5.5 non è ancora stato rilasciato, è possibile iniziare a utilizzare immediatamente la nuova API.

È possibile scaricare la libreria di compatibilità da qui: https://github.com/ircmaxell/password_compat

anche: hai chiesto cosa "sale" è. Dal momento che l'ho menzionato un paio di volte in questa risposta, dovrei affrontare anche quella parte della domanda.

Salt è fondamentalmente una stringa aggiuntiva aggiunta alla password durante l'hashing, al fine di renderla più difficile da decifrare.

Ad esempio, un utente malintenzionato può sapere in anticipo quale sia il valore hash per una determinata stringa di password o anche un intero lotto di stringhe di password specificate. Se riesce a ottenere i dati hash e non hai usato un sale, può semplicemente confrontare i tuoi hash con il suo elenco di password conosciute, e se qualcuno dei tuoi utenti usa una password facile da indovinare, sarà rotto in pochi secondi, indipendentemente dal metodo di hashing utilizzato.

Tuttavia, se hai aggiunto una stringa extra segreta alla password quando lo hai cancellato, il valore dell'hash non corrisponderà all'hash standard per la password originale, rendendo così più difficile per l'utente malintenzionato trovare il valore .

La buona notizia è che se si utilizza l'API di cui ho parlato sopra, non è necessario preoccuparsi troppo dei dettagli di questo, in quanto l'API gestisce la salatura per voi.

Spero che questo aiuti.