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?
quelle
Antworten:
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.
quelle
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).
quelle
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 ...
quelle