È possibile recuperare la password con hash basata su DES se è noto il sale?

6

Può essere ripristinata una password con hash se l'hashing viene eseguito con la funzione crypt basata DES in PHP e sia l'hash che il sale sono noti all'attaccante?

Considera il seguente esempio:

$salt = 'mysalt';
$pass = 'mypass';
$hashed_pass = crypt($pass, $salt);
// $hashed_pass = myDUAMR/WMo7.

So che John the Ripper può rompere questo, ma non restituirà la password, ma restituirà una stringa che può essere utilizzata per creare lo stesso valore di hash. La password reale può essere ripristinata nello scenario indicato?

    
posta luben 12.07.2011 - 14:05
fonte

2 risposte

14

John the Ripper funziona provando le password possibili, molto rapidamente. Non sempre interrompe una cripta basata su DES, o almeno non facilmente.

Con la funzione di hashing basata su DES, le password possono contenere fino a 8 caratteri e solo 7 bit vengono utilizzati per ogni carattere (il bit superiore viene ignorato). Considerando che la password è stata digitata ad un certo punto da un utente su una tastiera, si può supporre che ci siano 95 valori possibili per ogni carattere (caratteri ASCII dallo spazio [32] a tilde [127]), quindi 6704780954517121 potenziali password (che è 1 + 95 + 95 2 + 95 3 + ... + 95 8 ). È abbastanza; l'enumerazione di tutte le possibilità su un PC richiederà almeno alcune settimane. Ma è ancora tecnologicamente fattibile.

DES è una funzione di crittografia, ma la crypt basata su DES è non DES; la funzione interna è alterata (dal sale, cioè), eseguita 25 volte e, cosa più importante, i ruoli della chiave e il messaggio vengono scambiati. Il risultato finale è che il nome "crypt" è improprio (anche se tradizionale): questa non è più una funzione di crittografia ; dovrebbe essere chiamato "hash basato su DES ". Ciò significa che potrebbero esserci (e infatti ci sono) due password distinte che hanno lo stesso valore (anche se usano lo stesso sale). Ad esempio, questo post del blog mostra che con il sale " hi ", entrambi " cqjmide " e " ifpqgio " hash allo stesso valore " hiH9IOyyrrl4k " (il post del blog afferma che questa è la prima collisione pubblicamente conosciuta, che mostra quanto il problema sia interessante poiché non è difficile: questi sono valori a 64-bit, quindi il costo di trovare una collisione è di circa 2 32 invocazioni di crypt() ; che la prima collisione pubblicata è comparsa solo alla fine del 2010 prova che nessuno ha mai provato prima) .

(Nota: contrariamente a quanto afferma il post del blog, la possibilità di trovare collisioni non ha alcuna influenza sulla sicurezza del sistema di hashing delle password. L'hash basato su DES non dovrebbe più essere utilizzato più a causa della facilità di produzione tali collisioni, ma perché ha spazi di input e output troppo piccoli ed è troppo veloce.)

Di conseguenza, dal solo sale e hash, non c'è modo di individuare la "password", perché le informazioni non sono lì. Tramite l'enumerazione di tutte le password possibili, è possibile creare l'elenco delle password corrispondenti, ma non è possibile stabilire quale sia l'utente a cui si è pensato. Tuttavia, e questo è il punto importante qui, la macchina che usa il risultato dell'hash basato su DES in un sistema di verifica della password non può dire: qualsiasi password che corrisponde al valore di hash e di sale è una buona password , reale come qualsiasi altro. Se il sale e l'hash sono " hiH9IOyyrrl4k ", sono accettati sia " cqjmide " sia " ifpqgio ": anche se pensavi che la tua password fosse "cqjmide", posso ancora accedere sotto il tuo nome usando " ifpqgio "come password.

Nota, tuttavia, che la stragrande maggioranza dei possibili valori hash hanno una sola password corrispondente, quindi la ricerca esauriente troverà quella password e nessun altra.

Su una nota simile, poiché vengono utilizzati solo i primi otto caratteri, è possibile avere una password lunga 40 caratteri, dalla quale gli ultimi 32 caratteri saranno totalmente ignorati dall'hash basato su DES. Non c'è modo di recuperarli dal valore hash poiché vengono semplicemente eliminati e non hanno alcuna influenza sull'hash calcolato.

    
risposta data 12.07.2011 - 15:08
fonte
3

Non è possibile calcolare tutte le collisioni di una determinata password (usando l'algoritmo di hash), sono infinite. Se John può darti una password che corrisponde al digest dell'hash, allora puoi teoricamente recuperare la password reale. Ma non puoi:

  1. Assicurati che una corrispondenza trovata sia la password originale
  2. Assicurati di trovare la password originale (dovrebbe essere conosciuta) in tempo utile.

Il meglio che puoi fare per trovare la password sarebbe provare un attacco di dizionario e facendo presupporre che l'utente abbia usato una parola di questo dizionario (o varianti che sei disposto a calcolare). È meno probabile trovare due collisioni da due parole distinte del dizionario. Quindi questo ti darebbe una buona certezza di avere la password originale. Ma ovviamente questa è solo statistica.

    
risposta data 12.07.2011 - 15:00
fonte

Leggi altre domande sui tag