Memorizzazione di dati riservati non crittografati nella memoria del client

1

Attualmente sto lavorando a un servizio che consente agli utenti di archiviare i dati crittografati sul lato client e accedervi ovunque. Il client si connette tramite un browser e la webapp è scritta in JavaScript. Per gestire più facilmente i dati memorizzati, vorrei implementare una funzione di ricerca.

L'intero concetto del server che non conosce cosa viene memorizzato significa che i dati non sono ricercabili sul lato server. Pertanto i dati devono essere decifrati in qualche modo.

  • È sicuro decrittografare tutti i dati e archiviarli in memoria per il tempo della sessione dei client (memorizzarli in una variabile)?

Per motivi relativi all'esperienza dell'utente, chiedere la password degli utenti (chiave di crittografia) ogni volta non è qualcosa che potrebbe funzionare. Sono a lungo termine.

    
posta Alex 05.04.2015 - 00:31
fonte

2 risposte

1

In cima alla mia testa, posso pensare a quattro modi in cui questa strategia potrebbe fallire. Tutto può essere mitigato in una certa misura attraverso pratiche di sviluppo e buon senso da parte degli utenti, e alcuni richiederebbero alcuni attacchi molto mirati, ma sono comunque rischi.

Numeri

La memorizzazione di dati riservati nell'heap sarà rischiosa se si intende utilizzare eval , poiché il codice in esecuzione in eval può accedere alle variabili nell'ambito della chiamata eval, che potrebbe includere le variabili heap. Prendere in considerazione:

var creditCardNumber = 123456789;
var evalString = "window.alert(creditCardNumber)";
eval(evalString); // alerts the credit card number!

Ci sono un paio di modi in cui un utente malintenzionato potrebbe montare un attacco:

  • Se evalString viene pescato da un database, un utente malintenzionato potrebbe tentare di influenzare tali dati in qualche modo
  • Se la tua applicazione utilizza un codice di terze parti, un utente malintenzionato potrebbe provare a dirottare tale risorsa e utilizzare eval per afferrare i dati e inviarli in avanti (ricorda: il codice eseguito da diversi script continuerà a condividere l'heap stesso). Questo rischio potrebbe essere mitigato se i dati riservati sono in qualche modo trattenuti in una chiusura anziché esposti direttamente sull'heap, ma tali pratiche sarebbero facili da interrompere per uno sviluppatore ingenuo.

Ricorda che chiamare window.setTimeout e window.setInterval con argomenti stringa sono alias anche per eval .

Estensioni browser

Le estensioni del browser possono avere l'opportunità di ispezionare il contenuto dell'heap di JavaScript, direttamente o indirettamente. Ad esempio, Chrome fornisce un'API di debug per estensioni create come strumenti per sviluppatori. Gli utenti devono tuttavia concedere le autorizzazioni per utilizzare queste estensioni e installarle di proposito, quindi questo potrebbe non essere un modo semplice per montare un attacco.

Reverse engineering

Anche il codice minificato può ancora essere decodificato, quindi è sempre possibile per gli utenti malintenzionati ragionare su come si sta eseguendo la crittografia e il modo in cui l'applicazione JavaScript si scontra con il server.

Esposizione accidentale tramite codice di terze parti

Potresti essere sicuro che il tuo codice non assegna mai creditCardNumber a qualcosa di persistente come localStorage o lo serializza a JSON e lo spinge a window.name , ma sei altrettanto sicuro del codice di terze parti? Potrebbe valerne la pena controllare se stai passando l'oggetto, in particolare se lo stai passando a qualcosa che tenta di eseguire il caching.

    
risposta data 07.04.2015 - 15:51
fonte
0

È possibile utilizzare una libreria di crittografia JavaScript per il processo di crittografia / decrittografia e archiviare i dati non crittografati in sessionStorage nel browser. È sicuro? Solo sicuro come la tua app, il browser, il sistema operativo e il computer su cui è in esecuzione.

Memorizzando la chiave di crittografia nel browser dell'utente, diciamo in localStorage, in modo che permanga tra una sessione e l'altra, è intrinsecamente meno sicura di quella richiesta all'utente per ogni chiave. Potresti voler offrire ai tuoi utenti la possibilità di memorizzare la chiave in localStorage come opzione, ma non lo rendere obbligatorio.

    
risposta data 06.04.2015 - 13:08
fonte

Leggi altre domande sui tag