Archiviazione sicura di dati segreti in un'applicazione Web lato client

11

Ho questa applicazione web che sarà tutta la tecnologia lato client (HTML, CSS, JavaScript / AngularJS, ecc ...). Questa applicazione web interagirà con l'API REST per accedere e modificare i dati. Al momento è indeciso sul tipo di sistema di autenticazione che l'API REST utilizzerà.

Da quanto ho capito, qualsiasi tipo di sistema di autenticazione API (API Keys, OAuth 1/2, ecc.) avrà determinati dati che devono essere mantenuti segreti altrimenti l'accesso può essere compromesso. Per API Keys, le chiavi stesse devono essere segrete, per OAuth 2 i token / token di accesso segreti / token di client devono essere tenuti segreti, sono sicuro che alcune delle 4 chiavi coinvolte in OAuth 1 devono essere mantenute segrete (non troppa esperienza con OAuth 1). Ho cercato di pensare se c'è un modo per archiviare questa roba segreta in una pura applicazione web lato client senza uno strato intermedio di sorta sul lato server.

Ho cercato di pensarci e non riesco a pensare a nessun posto dove farlo. Voglio dire, non posso memorizzarlo in javascript, perché chiunque può solo visualizzare la fonte o aprire la console e ottenere i dati. Non sono sicuro al 100% di quanto sia sicuro localStorage e se gli utenti possono accedere / modificare tali dati. Anche se lo storage locale era sicuro, i due modi in cui posso pensare di ottenere dati in esso non lo sono. Un modo è quello di archiviare i dati nel codice sorgente javascript che è la cosa più insicura che riesca a pensare. Ora, se stavo usando qualcosa come OAuth 2 in cui il resto della stessa API mi avrebbe dato i token, non sarebbe comunque così sicuro (meglio della prima opzione) perché quei token sarebbero restituiti come testo normale a chiunque possa vedere il richieste che il computer sta facendo potrebbe vedere.

C'è un modo per avere un'applicazione che sta eseguendo completamente lato client in grado di archiviare in modo sicuro pezzi segreti di dati senza una sorta di middle layer sul lato server?

    
posta ryanzec 05.04.2013 - 19:15
fonte

3 risposte

9

No, non può mai essere completamente sicuro. L'utente ha il controllo dell'hardware e stai cercando di tenere qualcosa fuori dalle loro mani. Alla fine, possono ottenerlo attraverso un mezzo o l'altro. Dato che stai lavorando da javascript, la tua posizione è MOLTO peggiore di una normale applicazione per computer, in quanto non solo l'utente controlla l'hardware, ma controlla anche la sandbox in cui stai eseguendo.

Puoi nascondere le cose e rendere difficile l'accesso alle cose, ma alla fine possono farlo, se ci provano abbastanza.

    
risposta data 05.04.2013 - 19:51
fonte
2

Quando si progettano sistemi di sicurezza, si deve sempre pensare al modello di minaccia. " Rendi sicuro " è un requisito sciocco, non utilizzabile o verificabile. " Impedisci all'utente di estrarre i token di accesso dall'applicazione " è molto meglio e definisce i limiti della soluzione. " Impedisci agli altri di ottenere i token di accesso di un utente " è anche migliore e definisce uno spazio di soluzione completamente diverso. Le soluzioni per una non risolvono necessariamente l'altra ( ad es. , quest'ultima richiede assolutamente SSL se è coinvolta la rete Wi-Fi, ma ciò non influirà affatto sulla prima).

    
risposta data 07.04.2013 - 15:07
fonte
0

un'opzione prevede che l'API REST conceda l'accesso o meno in base all'accesso utente; può restituire un token basato su sessione (guid, stringa con hash, qualunque cosa tu voglia) che può essere passato alle altre chiamate API REST per autenticare l'accesso

se sei preoccupato di memorizzare le informazioni di accesso dell'utente sul computer client, allora non farlo, ma l'utente dovrà inserire le informazioni su account e password ogni volta

Non che abbia familiarità con OAuth e altri, ma non vedo alcun motivo valido sopra per memorizzare in modo persistente le informazioni di autenticazione ...

    
risposta data 05.04.2013 - 23:19
fonte

Leggi altre domande sui tag