Qual è la differenza tra la funzione di derivazione chiave e l'hash (salato)?

2

Vedo in questo post che la differenza principale è che gli output KDF hanno "determinate proprietà di casualità" e non capisco cosa significa. Supponendo che "certe proprietà di casualità" siano per la protezione dalle tabelle arcobaleno e da quelle cose precalcolate.

Ma usando l'hash con un'adeguata salatura possiamo anche proteggere da quegli attacchi. Quindi in questo senso credo che non ci siano differenze tra questi due strumenti, che differiscono solo per l'implementazione.

So anche che l'altro obiettivo del KDF è essere abbastanza slow per rallentare gli attacchi ipotetici, senza rovinare l'esperienza dell'utente in termini di velocità. Bene, in senso stretto, questo potrebbe essere ottenuto anche con l'hashing aggiungendo alcune operazioni inutili (ad esempio for(i = 0; i < 1000000; i++); ), anche se non sarebbe molto pulito.

Quindi, qual è la differenza? Uno è migliore dell'altro? Quando dovremmo usarne uno e quando l'altro?

    
posta Julen 31.07.2015 - 00:33
fonte

1 risposta

3

Ci sono in realtà due tipi di KDF. Un tipo è progettato per derivare una chiave dall'input ad alta entropia (come un'altra chiave); questo può essere fatto con un hash veloce digitato come HMAC. L'altro tipo accetta una password come input. Le password sono a bassa entropia; non sono intrinsecamente molto difficili da usare per la forza bruta. Un buon hash della password deve quindi essere lento.

Nella tua domanda, hai detto che l'aggiunta di for (i=0; i<bignum; i++); avrebbe rallentato l'hash. Questo è in realtà completamente inutile. L'attaccante non deve giocare secondo le tue regole. Gli hash devono proteggere le password quando gli hacker hanno una copia degli hash. Se l'attaccante può calcolare rapidamente gli hash, non importa quanto lentamente tu li calcoli. Gli hash devono essere intrinsecamente lenti; non ci dovrebbero essere scorciatoie per valutarle più velocemente del legittimo server.

Le "proprietà di casualità" sono perché un KDF deve produrre una chiave. Non hanno nulla a che fare con la precomputazione, comprese le tabelle arcobaleno. Gli algoritmi crittografici tipicamente fanno alcune ipotesi sulla chiave; tra le altre cose, normalmente assumono che sia stato selezionato totalmente a caso dall'insieme delle possibili chiavi. Si prevede inoltre che le chiavi abbiano una certa lunghezza; le loro funzioni di derivazione richiedono output di lunghezza arbitraria. Al contrario, va bene se un hash della password ha un sacco di struttura per l'output. Forse c'è il 70% di probabilità che i bit adiacenti abbiano lo stesso valore. Forse diffonde 128 bit di entropia in 4096 bit di output. Finché è difficile invertire, è un bel hash, ma non è adatto come chiave.

Una funzione di derivazione della chiave basata su password sicura è un hash sicuro per la password (PBKDF2 è in effetti uno dei grandi 3 hash). Il contrario non è necessariamente vero. Quale utilizzare è semplice: utilizzare una funzione di derivazione della chiave basata su password per ricavare una chiave da una password e un hash per memorizzare le password.

    
risposta data 31.07.2015 - 01:52
fonte

Leggi altre domande sui tag