TL; DR Dato che tutte le informazioni di stato per un browser Web sono accessibili a un utente (potenzialmente ostile), come può essere considerata sicura l'autenticazione challenge-response tra il browser e il server?
Versione più lunga
Sto sviluppando un'applicazione web e voglio implementare socket web per la comunicazione tra il client e il server. Sto cercando di implementare un router WAMP e sto cercando di capire le modalità di autenticazione con un sistema come questo.
Il protocollo WAMP consente l'autenticazione challenge-response (CRA). Il modo in cui lo capisco (e per favore correggimi se ho sbagliato), quando un client effettua una richiesta di connessione, il server invia una richiesta. Il client quindi crittografa la richiesta utilizzando una chiave segreta condivisa tra il client e il server e la restituisce. Il server controlla la versione crittografata dal client e, se è stata crittografata correttamente, consente l'accesso. L'uso di un segreto condiviso consente al server di sapere che la richiesta proviene da un cliente autorizzato.
Questo porta alla domanda n. 1 : il codice Javascript inviato al browser deve contenere il segreto condiviso. Quindi il segreto condiviso non è molto segreto, vero? Quindi, come possiamo considerare questo un metodo di autenticazione sicuro?
Nel pensare a questa domanda, ho trovato una soluzione che penso possa risolvere il problema.
Nota importante: tutte le connessioni saranno protette tramite TLS.
Ecco come potrebbe funzionare il mio sistema di autenticazione:
-
l'utente accede tramite il normale metodo di autenticazione basato su modulo
Il server -
genera una chiave di autenticazione e un segreto e passa tali valori al client come parte della pagina HTML. La chiave e il segreto sono entrambi generati tramite un metodo crittograficamente sicuro.
-
client avvia quindi la connessione websocket. Inizia la sequenza di autenticazione challenge-response, utilizzando la chiave e il segreto generato dal server
-
il server si autentica, usando la chiave & segreto, e tutto è bello.
La chiave qui è l'uso monouso della chiave e dei valori segreti. Se cambiano periodicamente, non è possibile che un utente malintenzionato generi una coppia chiave / segreta o ne usi una che aveva salvato da una visita precedente.
Che mi porta alla domanda n. 2 : si tratta di uno schema di autenticazione adeguato?
Infine, domanda n. 3 : supponendo che lo schema di autenticazione descritto sopra sia adeguato, con che frequenza dovrebbero cambiare i valori chiave / segreto? Sto pensando che dovrebbe cambiare definitivamente ogni volta che l'utente accede e dovrebbe scadere anche dopo 6-8 ore. Pensieri?