Am I right to say that this won't work if the password is not stored in plain text on the server? I fail to see how the server could verify the hash if the password is already hashed (with salt and pepper) on the server.
Questo schema richiede che la password sia archiviata in chiaro. Molto male.
Can this scheme be extended to work with hashed passwords somehow?
Sono sicuro che può, ma non ce n'è bisogno. Lo schema a cui hai fatto riferimento è il protocollo di autenticazione del digest HTTP . È stato scritto in un giorno in cui SSL era considerato costoso da implementare in molti sistemi. Authn di digest ha fornito un modo per accedere tramite canali di testo libero senza esporre la password. Non c'è assolutamente alcuna ragione per farlo più. SSL ora è effettivamente gratuito.
In generale, il rischio di memorizzare le password sul server è considerato superiore al vantaggio di avere il server che non ha la password in memoria per un breve periodo di tempo (il tempo dalla ricezione del messaggio della password fino all'inizio dell'ashing e il cleart- la memoria della password del testo può essere cancellata).
Ci sono alcune situazioni in cui l'hashing lato client può avere senso. Ad esempio, LastPass implementa un meccanismo di autenticazione univoco che implica l'hashing client e server. Lo fanno perché utilizzano la password come base per la creazione della chiave di crittografia e non vogliono che il server conosca la chiave di crittografia. Quindi quello che fanno è:
- Molti cicli di PBKDF2 sul client per creare una chiave di crittografia strong.
- Un round di SHA-256 per trasformare la chiave di crittografia in quella che è effettivamente la tua password.
- Invia password al server. Si noti che le proprietà di SHA-256 rendono computazionalmente impossibile reinserire la password nella chiave di crittografia.
- Il server esegue l'hashing standard lato server usando PBKDF2 e salt.
Fondamentalmente, il server LastPass esegue l'archiviazione standard delle password ma quello che ottiene come "password" è il risultato dell'hashing sul lato client.