OAuth: Wie ausblenden-API Secret Key von javascript

Wir sind in den Prozess der Migration unserer MVC-basierte server-Anwendung und eine REST-ful API, durch die Anrufe abgewickelt werden.

Ich gelesen habe bis auf AES-Verschlüsselung und OAuth2 und beschlossen, eine Lösung gewachsen, bilden diese Konzepte wie folgt:

  1. Client sendet eine Anforderung zur Anmeldung in der Bereitstellung einer Benutzer-id oder E-Mail. Diese Anforderung ist HMAC würde über eine API Secret Key.
  2. Prüft der server, ob die Benutzer-id/E-Mail entspricht ein vorhandenes Konto, und wenn er eine findet, erstellt und speichert einen server-nonce, die es sendet, das als Teil der Antwort an den client.
  3. Der client erstellt Ihr eigenes client-nonce und erstellt eine neue temporäre Schlüssel aus der API Secret key und die beiden nonces. Es sendet dann eine login-Anfrage mit einem Passwort verschlüsselt werden mit diesem temporären Schlüssel [für zusätzliche Entropie und um zu vermeiden, jemals senden Sie ein Kennwort in plaintext].
  4. Der server entschlüsselt das Passwort und HMAC unter Verwendung der neuesten nonce, die es gespeichert hat, für diesen Kunden auf dieser Plattform [eine mobile und eine web-client können haben Ihre eigenen nonces und Sitzungen] und der client-nonce, die in Klartext gesendet wurde, wenn der HMAC checkt es dann überprüft das Passwort für die Datenbank [PBKDF2 hashing und salting].
  5. Wenn die Anforderung gültig ist und das Passwort und Benutzer-id-match-Aufzeichnungen, eine neue Session-Secret-Key erstellt UserID auf dieser Plattform und dieser Geheime Schlüssel wird an den client gesendet und wird verwendet, um HMAC jeder API-Anfrage aus Hut client fortan.
  6. Keine neuen nicht-login-Anfrage soll eine HMAC-Signatur berechnet sich aus dem Session-Secret-key und randomisierte IV.

Alle Kommunikation erfolgt über TLS, so ist dies zusätzliche Sicherheit und nicht die einzige Linie der Verteidigung.

Auf dem mobile-apps diese würde funktionieren, da können Sie verstecken die Mobile App, die den Geheimen Schlüssel auf eine config-Datei, und diese gibt ein paar anständige Maß an Sicherheit, [vielleicht nicht viel, ich bin nicht vollständig sicher] aber wenn wir versuchen, zu konvertieren alle Anfragen von unserer Webseite zu dieser form würde dies bedeuten, dass mit Hilfe von Javascript verarbeiten der client-seitige AES-Verschlüsselung und Authentifizierung und ... auch dieser Artikel deutlich erklärt, "wenn Sie speichern Sie Ihre API-Schlüssel in eine JavaScript-web-app, die Sie könnte genauso gut einfach drucken Sie es aus in großen Fetten Buchstaben über der homepage, die ganze Welt hat jetzt Zugang zu über die browser-dev-tools".

Könnte ich nur die nonces, wie die API-Secret-key-oder verzichten auf die Verwendung von AES-Verschlüsselung für diese Anfragen zusammen und versuchen, zu überprüfen durch andere Mittel, wie z.B. durch CSRF-Token vor und macht Sie sicher, dass alle Anfragen kommen, als unsere eigene front-end-in gewisser Weise - aber das würde nicht funktionieren, wenn wir wollten erstellen eine API ermöglicht die integration mit anderen Seiten oder Dienstleistungen, und selbst dann, wie würde ich mich über die Sicherung der client-secret-Session-key?

Den Artikel schlägt Erzeugung von single-use-cookies als ein Token, aber das ist eine begrenzte Lösung, die funktioniert für die poster die Leistungen würden aber nicht für uns. Ich möchte in der Lage sein, um HMAC jeder Anfrage schickt der Benutzer mit einer Benutzer-spezifischen Schlüssel, die ablaufen können, und zurückgesetzt werden und, da der Dienst schließlich um Geld, ich möchte eine Authentifizierung anfordern, um gesperrt werden knapp.

Also, was sind meine Optionen?

Muss ich nur Graben Javascript, da es zum scheitern verurteilt ist? Gibt es eine Möglichkeit zum speichern eines geheimen Schlüssels, ohne daß es klar wie der Tag ist hardcoded in die .js-Skript? Soll ich erstellen eine neue temporäre Schlüssel werden verwendet für den login nur Anrufe und senden, die dem Benutzer beim anfordern der server-nonce?

Auch, den Beitrag habe ich verlinkt, um erste schlägt vor, die ein cookie zum speichern der Session-Schlüssel für den client und dann auf dem Schlüssel von JS. Ist das ok oder würde, die mehr Löcher, als es Robben?

InformationsquelleAutor ConnorU | 2016-07-21
Schreibe einen Kommentar