Abbiamo un sito web in cui gli utenti devono accedere per accedere alle informazioni privilegiate. Ovviamente stiamo usando SSL, ma voglio anche evitare che le password in chiaro finiscano accidentalmente nei log del server, o gli occhi vagabondi degli amministratori. Pertanto, voglio implementare l'hashing lato client usando Javascript.
Inoltre, voglio evitare di rivelare coppie di utenti con password identiche, quindi utilizzare un sale specifico per utente. Infine, vorrei aggiungere una sfida casuale (alias nonce) nel mix per assicurarmi che un intercettatore * non possa usare l'hash finale come la nuova "password". Farò un roundtrip aggiuntivo al server web per ottenere il sale e la sfida prima di iniziare l'hashing della password. *) Sì, stiamo usando SSL, ma come difesa approfondita mi piacerebbe rendere l'implementazione più solida possibile.
Soprattutto la sfida è impegnativa. L'unica implementazione possibile che conosco è la prima volta che si calcola l'hash della password finale (usando bcrypt, scrypt o PBKDF2) e poi si esegue un ulteriore sha256_hmac round usando la sfida. Sul lato server recuperiamo l'hash della password dal database ed eseguiamo lo stesso sha256_hmac aggiuntivo e confrontiamo il risultato.
Tuttavia, quanto sopra implicherebbe che il calcolo dell'hash della password full deve essere eseguito lato client in Javascript, perché l'hashing nella sfida dovrebbe sempre essere l'ultimo passaggio. Su un iPhone legacy (?), Solo 6 round di crittografia o 5000 round di PBKDF2-SHA256 possono essere eseguiti entro 2 secondi, il massimo ritardo che possiamo tollerare.
Domanda n. 1: sono sicuro che oggigiorno bcrypt dovrebbe essere almeno 12 round e PBKDF2-SHA256 almeno 5000 round? Quindi dovrei scegliere i 5000 round di PBKDF2-SHA256?
Domanda n. 2: Esistono meccanismi di risposta alle sfide che possono operare prima nel processo (ad esempio su una password con hash una volta), quindi posso lasciare il bcrypt / PBKDF2 hardening al server web?
Domanda n. 3: supponendo che non esista un tale meccanismo di risposta alle sfide, è meglio abbandonare il mio requisito di risposta alla sfida e applicare solo un client salino specifico per utente e fare il lato completo del server di protezione? Ciò comporterebbe un sistema complessivo più strong rispetto all'utilizzo di un meccanismo di risposta alle sfide e meno round?
EDIT: riepilogare la lunga serie di commenti che seguono sulla sicurezza dell'hashing lato client in generale: l'opinione generale sembra essere che la complessità aggiunta non ne vale la pena ed è meglio mettere lo sforzo nel controllo del server codice a lato e limitazione dell'accesso lato server per il personale non autorizzato.