Ho implementato l'autenticazione PBKDF2 per alcuni servizi Web.
Al client vengono fornite le seguenti informazioni, in modo che possano duplicare la funzione PBKDF2:
- l'algoritmo di hashing (SHA256)
- una password segreta di 30 byte
- il numero di iterazioni (4096)
- la lunghezza dell'hash (32)
Si prevede che il client generi un sale casuale crittograficamente sicuro e lo utilizzi nella funzione PBKDF2. L'hash PBKDF2 risultante e una codifica base64 del salt viene quindi aggiunto a un'intestazione X-Authorization in ogni richiesta.
es. Autorizzazione X: 882fac38qkf98ff1ed29W4bd2f95P214 = & & = 2c55a195
Tutte le richieste vengono eseguite su https: //. Ho sempre avuto l'impressione che un nuovo salt dovrebbe essere generato su ogni richiesta, in quanto ciò previene gli attacchi dei tavoli arcobaleno ... ma è davvero necessario?
Diciamo che qualcuno sfonda il livello TLS e così può vedere l'hash della password e il sale che è stato usato. Sono intenzionati a rompere questa password e quindi creano una tabella arcobaleno utilizzando questo sale visibile. Dubito che creino una password di 30 byte, ma se lo fanno, ora hanno la password che abbiamo inviato al client.
A questo punto, con la password, possono fare qualsiasi richiesta a loro piace. Non importa se un nuovo sale viene utilizzato su richieste future. Non è necessario creare un'altra tabella arcobaleno per craccarli, perché abbiamo già la password.
C'è qualcosa che sto trascurando o fraintendendo? C'è un vantaggio nel generare un nuovo salt ed eseguire la funzione PKDF2 ad ogni richiesta?