Stockage sécurisé des données secrètes dans une application Web côté client

11

J'ai cette application web qui va être toute technologique côté client (HTML, CSS, JavaScript / AngularJS, etc ...). Cette application web va interagir avec l'API REST afin d'accéder et de modifier les données. À l'heure actuelle, il est indécis sur le type de système d'authentification que l'API REST va utiliser.

D'après ma compréhension, tout type de système d'authentification API (clés API, OAuth 1/2, etc ...) va avoir certaines données qui doivent être gardées secrètes sinon l'accès peut être compromis. Pour les clés API, les clés elles-mêmes doivent être secrètes, pour OAuth 2, les jetons secret client / accès / rafraîchissement doivent être gardés secrets, je suis sûr que quelques-unes des 4 clés impliquées dans OAuth 1 doivent être gardées secrètes (pas trop d'expérience avec OAuth 1). J'ai essayé de penser s'il y avait un moyen de stocker ces trucs secrets dans une application Web pure côté client sans couche intermédiaire du côté serveur.

J'ai essayé de penser à cela et je ne peux penser à aucun endroit pour le faire. Je veux dire que je ne peux pas le stocker en javascript car n'importe qui peut simplement afficher la source ou ouvrir la console et obtenir les données. Je ne suis pas sûr à 100% de la sécurité de localStorage et si les utilisateurs peuvent accéder / modifier ces données. Même si le stockage local était sécurisé, les deux façons dont je peux penser d'y intégrer des données ne le sont pas. Une façon consiste simplement à stocker les données dans le code source javascript, ce qui est la chose la moins sûre à laquelle je puisse penser. Maintenant, si j'utilisais quelque chose comme OAuth 2 dans lequel l'api restante me donnerait les jetons, ce ne serait toujours pas aussi sûr (mieux que la première option) parce que ces jetons seraient retournés sous forme de texte brut que quiconque peut voir le les demandes que l'ordinateur fait pourraient voir.

Existe-t-il un moyen pour qu'une application complètement exécutée côté client puisse stocker des données secrètes en toute sécurité sans une sorte de couche intermédiaire côté serveur?

ryanzec
la source
Localstorage est spécifique au navigateur, mais en prenant Opera sous Windows comme exemple, ce ne sont que quelques fichiers de disque dans le dossier de profil de l'utilisateur, il n'est donc pratiquement pas protégé.
Ross Patterson
Une façon serait de garder le secret sur le serveur dans une base de données et d'avoir seulement application_id sur le client. Ensuite, faites la requête oauth depuis le serveur, c'est donc une sorte d'approche proxy.
Simon Polak

Réponses:

9

Non, il ne peut jamais être complètement sécurisé. L'utilisateur contrôle le matériel et vous essayez de garder quelque chose hors de sa portée. En fin de compte, ils PEUVENT l'obtenir par un moyen ou un autre. Puisque vous travaillez à partir de javascript, votre position est BEAUCOUP pire qu'une application informatique normale, car non seulement l'utilisateur contrôle le matériel, il contrôle le sandbox dans lequel vous exécutez.

Vous pouvez cacher des choses et rendre les choses difficiles, mais à la fin, elles PEUVENT les retirer, si elles essaient assez fort.

Michael Kohne
la source
4
^ ceci. Dans quelle mesure les données secrètes sont-elles «secrètes» et combien de temps et d'argent les protègent-elles réellement? Des efforts «standard de l'industrie» pourraient être suffisants.
DaveE
+1 Excellente réponse. Avec un débogueur JavaScript, je peux modifier votre application, afficher des valeurs intermédiaires, etc. Si je veux les informations, je les obtiendrai.
Ross Patterson
2

Lors de la conception de systèmes de sécurité, il faut toujours penser au modèle de menace. " Assurez-vous de la sécurité " est une exigence idiote, non applicable ou vérifiable. « Empêcher l'utilisateur d'extraire les jetons d'accès de l'application » est beaucoup mieux et définit les limites de la solution. " Empêcher les autres d'obtenir les jetons d'accès d'un utilisateur " est également préférable et définit un espace de solution complètement différent. Les solutions pour l'une ne résoudront pas nécessairement l'autre ( par exemple , cette dernière nécessite absolument SSL si le WiFi est impliqué, mais cela n'affectera pas du tout la première).

Ross Patterson
la source
0

une option consiste pour l'API REST à accorder l'accès ou non sur la base d'une connexion utilisateur; il peut renvoyer un jeton basé sur la session (guid, chaîne de hachage, comme vous le souhaitez) qui peut être transmis aux autres appels d'API REST pour authentifier l'accès

si vous craignez de stocker les informations de connexion de l'utilisateur sur la machine cliente, alors ne le faites pas, mais l'utilisateur devra saisir les informations de compte et de mot de passe à chaque fois

pas très familier avec OAuth et al, mais je ne vois aucune raison impérieuse ci-dessus de stocker les informations d'authentification de manière persistante ...

Steven A. Lowe
la source
Quant aux raisons, il y a toujours le «confort» qui est évidemment l'arc-némésis de la «sécurité» et de la «sécurité».
henon