Immagina di avere un'applicazione web che crittografa i dati dell'utente, come una nota o un foglio di calcolo, sia sul server che sul client.
Il normale processo per un utente che usa questa applicazione web è qualcosa del tipo:
- L'utente accede all'applicazione utilizzando un hash di login / password memorizzato sul server. (Come le normali applicazioni Web.)
- L'utente inserisce una chiave di sicurezza aggiuntiva che viene utilizzata per crittografare i dati del lato client. L'applicazione Web utilizza una libreria di crittografia lato client come SJCL
In questo esempio concentriamoci solo sul lato client.
La situazione è questa: il server è stato compromesso e un utente malintenzionato ha accesso alle chiavi lato server. L'utente malintenzionato non ha le chiavi laterali del client poiché non vengono mai memorizzate sul server.
Ora l'utente malintenzionato deve modificare JavaScript per leggere la chiave lato client quando l'utente lo inserisce nell'applicazione Web (lato client). Il Javascript sarebbe programmato per inviare la chiave al pirata informatico / server. Ora l'attaccante ha vinto.
Capisco che si presuma che una volta che si impadronisca del server, hai perso, ma mi piacerebbe sapere se i miei pensieri qui sotto consentono una soluzione sicura lato client.
La situazione
Si presume che l'HTML contenga qualche codice Javascript all'interno di alcuni tag di script e che ci sia anche un sacco di codice Javascript caricato tramite file Javascript esterni che risiedono sul server. È il Javascript che esegue l'applicazione web che è il problema. Dobbiamo supporre che l'autore dell'attacco abbia modificato qualsiasi Javascript, sia esso in linea o esterno.
Possibile soluzione?
Voglio essere in grado di generare un hash di tutti i Javascript caricati dal mio server. L'ha funzionerà come un'impronta digitale per il codice Javascript lato client e l'utente sarà diffidente nei confronti di un nuovo hash.
Questi sono i due modi in cui ho pensato finora:
-
Prendere un hash di tutti i file caricati sul client. Ciò significa richiedere di nuovo tutti i file inclusi.
-
Prendi un hash di tutto il codice Javascript in memoria. (Questo può anche essere fatto?)
Il problema comune con entrambe le opzioni è che qualsiasi funzione stia facendo questo hashing, deve essere abbastanza piccola da consentire all'utente interessato di verificare che sia sicuro da usare in pochi secondi.
Penso che questa funzione di hashing venga caricata nel browser come normale e che l'utente possa digitare il nome della funzione dalla console senza ()
in modo che possano vedere il codice, quindi digitare di nuovo con ()
per eseguire il codice.
Quindi l'hash dovrebbe essere sufficiente per dimostrare che l'applicazione web si trova in uno stato che l'utente sa di aver ispezionato in passato.
Questo potrebbe persino diventare un plugin a un certo punto, anche se sono determinato a vedere se è possibile una soluzione nativa.
In sostanza quello che sto chiedendo è, quali metodi esistono che ci permettono di dimostrare l'integrità dello stato del cliente?