Sicheres Speichern geheimer Daten in einer clientseitigen Webanwendung

11

Ich habe diese Webanwendung, die alle clientseitige Technologie (HTML, CSS, JavaScript / AngularJS usw.) sein wird. Diese Webanwendung wird mit der REST-API interagieren, um auf Daten zuzugreifen und diese zu ändern. Derzeit ist nicht entschieden, welche Art von Authentifizierungssystem die REST-API verwenden wird.

Nach meinem Verständnis wird jede Art von API-Authentifizierungssystem (API-Schlüssel, OAuth 1/2 usw.) bestimmte Daten enthalten, die geheim gehalten werden müssen, da sonst der Zugriff beeinträchtigt werden kann. Für API-Schlüssel müssen die Schlüssel selbst geheim sein, für OAuth 2 müssen die Client-Geheim- / Zugriffstoken / Aktualisierungstoken geheim gehalten werden. Ich bin sicher, dass einige der 4 an OAuth 1 beteiligten Schlüssel geheim gehalten werden müssen (nicht zu viel Erfahrung mit OAuth 1). Ich habe versucht zu überlegen, ob es eine Möglichkeit gibt, dieses geheime Zeug in einer reinen clientseitigen Webanwendung ohne eine Art mittlere Schicht auf der Serverseite zu speichern.

Ich habe versucht, darüber nachzudenken, und ich kann mir keinen Ort dafür vorstellen. Ich meine, ich kann es nicht in Javascript speichern, weil jeder nur die Quelle anzeigen oder die Konsole öffnen und die Daten abrufen kann. Ich bin nicht 100% sicher, wie sicher localStorage ist und ob Benutzer auf diese Daten zugreifen / sie ändern können. Selbst wenn der lokale Speicher sicher war, kann ich mir zwei Möglichkeiten nicht vorstellen, Daten in ihn zu übertragen. Eine Möglichkeit besteht darin, die Daten einfach im Javascript-Quellcode zu speichern, was die unsicherste Sache ist, die ich mir vorstellen kann. Wenn ich nun etwas wie OAuth 2 verwenden würde, in dem die restliche API selbst mir die Token geben würde, wäre das immer noch nicht so sicher (besser als die erste Option), da diese Token als einfacher Text zurückgegeben würden, den jeder sehen kann Anfragen, die der Computer stellt, könnten sehen.

Gibt es eine Möglichkeit, dass eine Anwendung, die vollständig clientseitig ausgeführt wird, geheime Daten sicher speichern kann, ohne dass eine mittlere Schicht auf der Serverseite vorhanden ist?

Ryanzec
quelle
Localstorage ist browserspezifisch, aber am Beispiel von Opera unter Windows sind es nur einige Datenträgerdateien im Profilordner des Benutzers, sodass es im Wesentlichen ungeschützt ist.
Ross Patterson
Eine Möglichkeit wäre, das Geheimnis auf dem Server in einer Datenbank zu behalten und nur application_id auf dem Client zu haben. Führen Sie dann die oauth-Abfrage vom Server aus, sodass dies eine Art Proxy-Ansatz ist.
Simon Polak

Antworten:

9

Nein, es kann niemals völlig sicher sein. Der Benutzer hat die Kontrolle über die Hardware und Sie versuchen, etwas aus seinen Händen zu halten. Letztendlich können sie es auf die eine oder andere Weise erreichen. Da Sie mit Javascript arbeiten, ist Ihre Position VIEL schlechter als bei einer normalen Computeranwendung, da der Benutzer nicht nur die Hardware, sondern auch die Sandbox steuert, in der Sie ausgeführt werden.

Sie können Dinge verstecken und es schwierig machen, an Dinge zu gelangen, aber am Ende können sie es herausholen, wenn sie sich genug anstrengen.

Michael Kohne
quelle
4
^ das. Wie "geheim" sind die geheimen Daten und wie viel Zeit und Geld ist es wert, sie tatsächlich zu schützen? "Industriestandard" -Anstrengungen könnten ausreichend sein.
DaveE
+1 Ausgezeichnete Antwort. Mit einem JavaScript-Debugger kann ich Ihre Anwendung ändern, Zwischenwerte anzeigen usw. Wenn ich die Informationen möchte, erhalte ich sie.
Ross Patterson
2

Beim Entwurf von Sicherheitssystemen muss immer an das Bedrohungsmodell gedacht werden. " Machen Sie es sicher " ist eine dumme Anforderung, die nicht umsetzbar oder überprüfbar ist. " Verhindern, dass der Benutzer die Zugriffstoken aus der Anwendung extrahiert " ist viel besser und definiert die Grenzen der Lösung. " Verhindern, dass andere Benutzer Zugriffstoken erhalten " ist ebenfalls besser und definiert einen völlig anderen Lösungsbereich. Lösungen für das eine lösen nicht unbedingt das andere ( z. B. erfordert das letztere unbedingt SSL, wenn WiFi beteiligt ist, aber das erstere wirkt sich überhaupt nicht aus).

Ross Patterson
quelle
0

Eine Möglichkeit besteht darin, dass die REST-API basierend auf einer Benutzeranmeldung Zugriff gewährt oder nicht. Es kann ein sitzungsbasiertes Token (Guid, Hash-Zeichenfolge, wie auch immer Sie möchten) zurückgeben, das an die anderen REST-API-Aufrufe übergeben werden kann, um den Zugriff zu authentifizieren

Wenn Sie Bedenken haben, die Benutzeranmeldeinformationen auf dem Clientcomputer zu speichern, tun Sie dies nicht, aber der Benutzer muss jedes Mal die Konto- und Kennwortinformationen eingeben

nicht so vertraut mit OAuth et al., aber ich sehe oben keinen zwingenden Grund, Authentifizierungsinformationen überhaupt dauerhaft zu speichern ...

Steven A. Lowe
quelle
Aus Gründen gibt es immer "Komfort", was offensichtlich der Erzfeind von "Sicherheit" und "Sicherheit" ist.
Henon