Ho scritto un piccolo server web che attualmente utilizza l'autenticazione di base su ssl. Finora tutto funziona alla grande. Ora voglio (necessario) per passare a digest auth. Ma non riesco a capire come farlo funzionare con password che non sono archiviate come cleartext nel database? Ho solo la password digerita (generata usando bcrypt) delle password dei miei utenti memorizzate. L'autenticazione del digest http è possibile?Password crittografata nel database e auth digest del browser
risposta
Stavo cercando proprio ora. Innanzitutto, ho letto il numero RFC 2617 - HTTP Authentication: Basic and Digest Access Authentication per avere un'idea delle specifiche e vedere come può essere adattato per un'autenticazione dell'API REST.
Esegui la stessa domanda che hai fatto- L'autenticazione digest significa che il server deve memorizzare la password dell'utente in testo normale?
This Stack Overflow risposta mette in chiaro: No. Il server non memorizzare la password in chiaro-it should store the hash of (username|realm|password)
.
Ciò andrebbe bene tranne che per una cosa: le specifiche canoniche supportano solo l'uso di MD5 come funzione hash.
Naturalmente è possibile memorizzare sia il bcrypt hash e l'hash MD5 ma così facendo mina solo la sicurezza del hash bcrypt efficace rendendolo inutilizzabile (in quanto un attaccante può spostare i suoi sforzi nella bruta costringendo l'hash MD5 anziché).
Così, ho preso un passo indietro e ho pensato, perché non ignorare le specifiche e utilizzare bcrypt su entrambi i lati come la funzione di hash (bcrypt(username|realm|password)
)?
Bene, oltre ad essere intenzionalmente lento, bcrypt has a maximum password length che makes it unsuitable for use as a general digest algorithm.
Wow, ormai la mia testa stava nuotando ma ho ancora pensato di dargli un altro andare. Alcuni dei suggerimenti erano di utilizzare TLS con SRP o crittografia autenticata, in particolare EAX, ma ho sentito che forse quelli stavano prendendo le cose solo un passo troppo lontano per un semplice servizio Web.
Per dirla in parole semplici, se sei davvero deciso a farlo puoi work around bcrypt's character limitation by using a preliminary hash.
Per farla breve, sembra che si può fare:
bcrypt(sha256(username|realm|password))
e l'uso che al posto di H(A1)
in una versione imbastardita delle specifiche.
La domanda ora diventa: tutto ciò che la complessità aggiunta valeva davvero? Abbiamo ottenuto un ulteriore livello di sicurezza rispetto all'autenticazione di base su HTTPS?
Molto tempo dopo l'evento lo so, ma un chiarimento fantastico: in genere evito di fare commenti "grazie" drive-by-noise, ma questo mi ha davvero aiutato a capire i limiti dell'author digest :) – ChrisV