Quale metodo di crittografia PHP è più incidentalmente sicuro?

0

Ho appena iniziato a cercare sugli ultimi metodi di crittografia PHP, ho scoperto che i miei algoritmi preferiti sono stati compromessi. MD5 non va bene, SHA-1 ha "trovato difetti", SHA-512 non è "pensato per le password", queste sono tutte provenienti da vari siti StackOverflow.

Gli HMAC del 2011 non avevano "attacchi noti", e PHP's password_hash è una nuova aggiunta che utilizza un "strong algoritmo a senso unico".

Ho sentito cose positive su HMAC + MD5, anche se è stato suggerito che sarebbe meglio usare un algoritmo che deve ancora essere compromesso. Vedo bcrypt è un add-on, c'è la crypt nativa () e ora mcrypt? Ma password_hash gestisce tutti questi?

Per me, tutto sta iniziando a sembrare un gioco mortale di ciò che suona meglio. Qualcuno con una conoscenza adeguata sull'argomento può rispondere: quali metodi di crittografia PHP compatibili con l'autenticazione tramite password sono attualmente più sicuri e non hanno vulnerabilità note? In altre parole, quale metodo produce l'hash che è meno probabile venga generato maliziosamente? Qualche funzionalità PHP nativa fa la lista?

    
posta John 23.12.2014 - 02:38
fonte

4 risposte

2

Come accennato in precedenza, la scelta della primitiva crittografica dipende da cosa si vuole fare con essa.

Per l'archiviazione delle password, si vorrà utilizzare un algoritmo di hashing. Un hash è un'operazione a senso unico che ti darà un output deterministico unico per un dato input, ma è impossibile invertire l'operazione. Ad esempio, se uso l'algoritmo sha-1 sulla stringa 'password', otterrò l'output '5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8' ogni volta. Non è possibile prendere la stringa '5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8', invertire l'operazione di hashing e ottenere la stringa 'password'. In questo modo è possibile autenticare l'utente eseguendo il hashing della password fornita accedendo all'hash che è archiviato nel database e se il database viene rubato (tramite SQL injection o altri mezzi) l'utente malintenzionato non è in grado di ottenere l'utente parola d'ordine.

E il cracking della password? Se un utente malintenzionato è in grado di accedere agli hash delle password dei tuoi utenti, proveranno a craccarli. Prenderanno un'ipotesi su quale sia la password in chiaro, eseguirla attraverso l'algoritmo di hash e confrontarla con il valore hash rubato dal database. Un sistema di cracking delle password personalizzato può farlo molto rapidamente, quindi dovresti prendere provvedimenti per difenderti.

Inserisci la funzione di derivazione chiave (KDF). Un KDF è simile al tuo hash standard, con una differenza: è molto lento. Fonderà in pratica l'hash dell'input su un numero specificato di iterazioni e solo dopo aver completato il numero specificato di iterazioni verrà visualizzato il valore corretto. Il risultato finale è che un utente malintenzionato deve impiegare molto più tempo per recuperare la password dell'utente, che ti farà guadagnare più tempo per rispondere alla violazione / reimpostare le password dell'utente, ecc.

Quindi, per portare un percorso lungo e tortuoso alla tua risposta, devi usare un KDF, come PBKDF2

    
risposta data 23.12.2014 - 18:22
fonte
2

Il nuovo password_hash introdotto in PHP 5.5.0 crea un algoritmo di hashing unidirezionale molto strong. Tutte le informazioni necessarie per verificare l'hash sono incluse in essa.

Ho provato a eseguire un ciclo per 5000 volte e ogni hash per una singola password era un hash univoco. Per creare un hash della password puoi semplicemente usare:

$password = '170991';
$hash = password_hash($password, PASSWORD_DEFAULT);

Per verificare la password, possiamo semplicemente usare:

password_verify($password, $hash);
    
risposta data 04.04.2015 - 19:09
fonte
0

Il bello delle funzioni password_hash() e password_verify() di PHP è che sono progettate pensando al futuro, ma sono anche progettate per essere compatibili con le versioni precedenti.

L'algoritmo di hashing che password_hash() usa per creare un hash è memorizzato nell'output prodotto da password_hash() , e questo è il modo in cui password_verify() sa quale algoritmo usare per verificare una determinata password con un determinato hash.

Man mano che gli algoritmi di hash più recenti / più potenti vengono inventati in futuro, questi saranno incorporati nelle funzioni password_hash() e password_verify() nelle versioni future di PHP. Tuttavia, poiché l'algoritmo di hashing è memorizzato nell'output di password_hash() , questa coppia di funzioni sarà sempre retrocompatibile. In altre parole, un hash creato oggi utilizzando password_hash() sarà possibile verificare da anni utilizzando password_verify() in una versione futura di PHP, anche se l'algoritmo utilizzato per creare l'hash oggi è obsoleto per quel momento.

Quindi, se utilizzi password_hash() e password_verify() , avrai sempre il vantaggio degli ultimi algoritmi di hash disponibili al momento e sarai sempre in grado di verificare gli hash creati utilizzando questi algoritmi in futuro, anche se quegli algoritmi diventano deprecati da quel momento.

    
risposta data 05.04.2015 - 03:32
fonte
0

these are all from various StackOverflow sites

Deve essere vero allora? Prendendo il caso di MD5, sì, è suscettibile di attacchi di collisione che possono essere applicati a firme e quindi ai certificati (e sha1 è molto simile a md5 ma con un hash più grande e più round). Tuttavia, applicarlo alle password è una proposta molto diversa. Per applicare il metodo di attacco alle password è necessario:

  • una copia della password con hash
  • da un servizio che accetta molto password lunghe

Ci sono altri modi per attaccare un sistema del genere - in particolare i tavoli arcobaleno - ma l'uso di un sale adatto offre molta protezione.

Se sha512 non è adatto per dati di hashing sicuri, siamo tutti in un sacco di problemi.

Alcune altre risposte menzionano password_hash () ma questa è una API non un algoritmo . Password_hash è una versione aggiornata di crypt () senza la compatibilità a ritroso per i metodi di hashing più deboli. Al momento della scrittura, password_hash () supporta solo bcrypt. Bcrypt è probabilmente più strong di md5 e sha1; nessuno è noto per avere debolezze algoritmiche, ma ciò non significa che nessuna abbia debolezza algoritmica.

Per quanto riguarda quale sia il metodo più sicuro attualmente disponibile, la mia ipotesi sarebbe pbkdf2 con un sale casuale e molte iterazioni di whirlpool o sha512. Se ciò è appropriato per la tua applicazione è una domanda molto più complessa.

    
risposta data 11.06.2017 - 00:28
fonte

Leggi altre domande sui tag