Per un nuovo sito Web (HTTPS con HSTS + HPKP), vorremmo limitare l'accesso all'accesso solo sui dispositivi dell'utente autorizzato. Per questo, c'è una chiave pubblica / privata WebCrypto ECDSA generata su ogni nuovo dispositivo. Il server memorizza la chiave pubblica del nuovo dispositivo e restituisce un ID dispositivo. Il browser salva in un IndexedDB denominato «dispositivo» la chiave privata (non estraibile) e l'ID del dispositivo.
Quando l'utente registra il suo account o desidera autorizzare un nuovo dispositivo, gli chiediamo una password per questo dispositivo, ma non vogliamo salvare la sua password nel database del server.
-
Potremmo usare il protocollo SRP e inviare il sale & «Verificatore» al server, ma piuttosto usando la password dell'utente, usiamo una password derivata (WebCrypto PBKDF2 o libreria Argon2)
-
Oppure potremmo usare nuovamente WebCrypto per creare nuove chiavi ECDSA, specifiche per questo utente su questo dispositivo, e inviare la chiave pubblica sul server. Sul browser, memorizziamo in un IndexedDB chiamato «base64 (SHA-256 (login)» questa chiave privata dell'utente ma crittografato (funzione wrapKey) con algoritmo AES-GCM e per la chiave usiamo la derivazione password utente (WebCrypto PBKDF2 o Argon2 libreria esterna) .Per effettuare il login, il server invia una sfida, una semplice stringa casuale, il client restituisce la firma di questa sfida con questa nuova chiave privata specifica dell'utente (quindi ha bisogno di conoscere la buona password per scartare la chiave).
Se il nostro DataBase è trapelato:
-
Con SRP, il verificatore non può permettere di indovinare facilmente la password dell'utente, ma suppongo che dobbiamo chiedere una nuova password a tutti i nostri utenti.
-
Con WebCrypto, è solo una chiave pubblica. Gli utenti non hanno bisogno di cambiare la loro password. EDIT: Uno svantaggio è che è possibile effettuare il controllo di più password sul lato client, ad esempio se ho saputo che la mia vittima potrei provare potrebbero essere 1000 password possibili sulla console JS per scartare la chiave privata dell'utente, senza la necessità di contattare il server .
Naturalmente, se i DNS indicizzati vengono cancellati sul browser, questo richiede all'utente di avviare un processo per recuperare il suo account (domanda privata, OTP via email, qualunque cosa ... non è l'argomento), ma questo non è specifico per l'opzione WebCrypto, è anche l'opzione SRP perché abbiamo bisogno di rilevare l'ID del dispositivo e controllarne la firma per essere sicuri che si tratti di un dispositivo autorizzato dall'utente.
Solo per informazione, aggiungiamo U2F dopo questa prima sfida di autenticazione.
Nel mio caso specifico, raccomandi di utilizzare SRP challenge o questa sfida WebCrypto per favore?