589 Stimmen

Wie schützt OAuth 2 vor Dingen wie Replay-Angriffen unter Verwendung des Security Token?

So wie ich es verstehe, läuft in OAuth 2 die folgende Kette von Ereignissen ab, damit Site-A zum Zugang Der Benutzer Informationen aus Site-B .

  1. Site-A registriert am Site-B und erhält ein Geheimnis und eine ID.
  2. Wenn Benutzer sagt Site-A zum Zugang Site-B , Benutzer wird gesendet an Site-B wo sie erzählen Site-B dass sie in der Tat gerne geben würden Site-A Berechtigungen für bestimmte Informationen.
  3. Site-B leitet um. Benutzer zurück zu Site-A zusammen mit einem Autorisierungscode.
  4. Site-A gibt dann diesen Autorisierungscode zusammen mit seinem Geheimnis zurück an Site-B im Gegenzug für ein Sicherheits-Token.
  5. Site-A stellt dann Anfragen an Site-B im Namen von Benutzer durch Bündelung des Sicherheits-Tokens zusammen mit den Anfragen.

Wie funktioniert das Ganze in Bezug auf Sicherheit und Verschlüsselung auf hohem Niveau? Wie schützt OAuth 2 vor Dingen wie Replay-Attacken unter Verwendung des Security Token?

51 Stimmen

Oauth2 hier einfach erklärt: gist.github.com/mziwisky/10079157

4 Stimmen

Lesen Sie die Spezifikation: tools.ietf.org/html/rfc6749 Sie werden überrascht sein, wie verständlich sie ist. Es ist auch korrekt, was vielleicht gar nicht so schlecht ist.

1 Stimmen

Diese Frage und ihre (aktuellen) Antworten konzentrieren sich alle auf einen bestimmten "Grant-Typ" in OAuth 2.0 (d.h. code ), aber es gibt andere in OAuth 2.0 definierte Grant-Typen, die für verschiedene Anwendungsfälle (z. B. nicht nutzerbezogene) relevant sind.

1454voto

Luis Perez Punkte 26807

Wie OAuth 2.0 in der Praxis funktioniert:

Ich fuhr auf dem Weg zur Arbeit an Olafs Bäckerei vorbei, als ich den köstlichsten Donut im Schaufenster sah - ich meine, das Ding triefte förmlich vor schokoladiger Güte. Also ging ich hinein und verlangte: "Ich muss diesen Donut haben!". Er sagte: "Klar, das macht 30 Dollar".

Ja, ich weiß, 30 Dollar für einen Donut! Er muss köstlich sein! Ich griff nach meiner Brieftasche, als ich plötzlich den Koch schreien hörte: "NEIN! Kein Donut für Sie". Ich fragte: "Warum? Er sagte, er akzeptiere nur Banküberweisungen.

Ernsthaft? Ja, er hat es ernst gemeint. Fast wäre ich auf der Stelle gegangen, aber dann rief der Donut nach mir: "Iss mich, ich bin köstlich...". Wer bin ich schon, dass ich die Befehle eines Donuts missachte? Ich sagte ok.

Er reichte mir einen Zettel, auf dem sein Name stand (der Chefkoch, nicht der Donut): "Sagen Sie ihnen, Olaf schickt Sie". Sein Name stand schon auf dem Zettel, also weiß ich nicht, was der Sinn dieser Aussage war, aber ok.

Ich bin eineinhalb Stunden zu meiner Bank gefahren. Ich reichte der Kassiererin den Zettel und sagte ihr, dass Olaf mich schickt. Sie warf mir einen dieser Blicke zu, die besagen: "Ich kann lesen".

Sie nahm meinen Zettel, verlangte meinen Ausweis und fragte mich, wie viel Geld ich ihm geben dürfe. Ich sagte ihr 30 Dollar. Sie kritzelte etwas herum und reichte mir einen weiteren Zettel. Auf dem Zettel stand eine Reihe von Zahlen, ich nahm an, dass sie so den Überblick über die Zettel behalten.

Zu diesem Zeitpunkt bin ich am Verhungern. Ich eile hinaus, anderthalb Stunden später stehe ich wieder vor Olaf und halte ihm meinen Zettel hin. Er nahm ihn, sah ihn sich an und sagte: "Ich komme wieder".

Ich dachte, er würde meinen Donut holen, aber nach 30 Minuten wurde ich misstrauisch. Also fragte ich den Mann hinter dem Tresen: "Wo ist Olaf?". Er sagte: "Er ist Geld holen gegangen". "Was meinst du?". "Er bringt einen Zettel zur Bank".

Also nahm Olaf den Schein, den mir die Bank gegeben hatte, und ging zurück zur Bank, um Geld von meinem Konto abzuheben. Da er den Schein hatte, den die Bank mir gegeben hatte, wusste die Bank, dass er der Typ war, von dem ich sprach, und weil ich mit der Bank gesprochen hatte, wussten sie, dass sie ihm nur 30 Dollar geben sollten.

Es muss lange gedauert haben, bis ich das begriffen habe, denn als ich aufblickte, stand Olaf vor mir schließlich mir meinen Donut zu geben. Bevor ich ging, musste ich fragen: "Olaf, hast du die Donuts immer so verkauft?". "Nein, früher habe ich es anders gemacht."

Hm. Als ich zurück zu meinem Auto ging, klingelte mein Telefon. Ich machte mir nicht die Mühe, ans Telefon zu gehen, es war wahrscheinlich mein Job, der mich feuern wollte, mein Chef ist so ein Arschloch. Außerdem musste ich über den Prozess nachdenken, den ich gerade durchlaufen hatte.

Ich meine, denken Sie darüber nach: Ich konnte Olaf 30 Dollar von meinem Bankkonto abheben lassen, ohne ihm meine Kontodaten geben zu müssen. Und ich brauchte mir keine Sorgen zu machen, dass er zu viel Geld abheben würde, weil ich der Bank bereits gesagt hatte, dass er nur 30 Dollar abheben dürfe. Und die Bank wusste, dass er der Richtige war, weil er den Schein hatte, den sie mir gegeben hatten, um ihn Olaf zu geben.

Okay, natürlich würde ich ihm lieber 30 Dollar aus meiner Tasche geben. Aber jetzt, wo er den Zettel hat, könnte ich der Bank sagen, dass er jede Woche 30 Dollar abheben darf, dann könnte ich einfach in der Bäckerei auftauchen und müsste nicht mehr zur Bank gehen. Ich könnte den Donut sogar per Telefon bestellen, wenn ich wollte.

Natürlich würde ich das nie tun - dieser Donut war ekelhaft.

Ich frage mich, ob dieser Ansatz breitere Anwendung finden kann. Er erwähnte, dies sei sein zweiter Ansatz, ich könnte ihn Olaf 2.0 nennen. Wie auch immer, ich gehe besser nach Hause, ich muss mich nach einem neuen Job umsehen. Aber nicht bevor ich mir einen dieser Erdbeershakes aus dem neuen Laden am anderen Ende der Stadt hole, ich brauche etwas, um den Geschmack dieses Donuts wegzuspülen.

47 Stimmen

Nun, in der Praxis sollte Olaf in der Lage sein, jederzeit 30 Dollar von Ihrem Konto abzuheben, auch wenn Sie keinen Donut bestellen. Interessanterweise ist das das Hauptziel in den echten oauth2.0-Szenarien :) Das ist sicherlich eine großartige Antwort, aber wer auch immer das liest, sollte sich den Git-Gist ansehen, den Paolo in seinem Kommentar zur Frage erwähnt hat ( gist.github.com/mziwisky/10079157 ). Eine gute ergänzende Lektüre, um das Konzept kristallklar zu machen.

4 Stimmen

Tolle Antwort, aber 2 Punkte, die ich ansprechen möchte: 1. wie @Samiron anmerkte, kann Olaf jederzeit 30$ nehmen, wenn er will. 2. In einem echten OAuth2.0-Szenario kann Olaf den Donut nicht servieren, bevor er Geld von der Bank abhebt. In diesem Beispiel hätte er den Scheck behalten und Luis einfach seinen wohlverdienten Donut aushändigen können. Wenn wir also das Beispiel dahingehend ändern, dass ich Olaf bevollmächtige, Teig von einem mir bekannten Dritten zu besorgen, dann würde es mehr Sinn machen, da Olaf den Teig besorgen müsste, bevor er mit dem Backen des Donuts beginnt (vorausgesetzt, der einsame Donut, den Olaf hatte, diente nur zu Ausstellungszwecken).

4 Stimmen

Ticker23, die Donut-Geschichte übertrifft leider Ihre technische Korrektur - ich war von der Geschichte begeistert, als ich sie las. Sie wurde von Homer Simpson geschrieben.

139voto

William Jones Punkte 17659

Nach dem, was ich gelesen habe, funktioniert das Ganze folgendermaßen:

Der in der Frage skizzierte allgemeine Ablauf ist korrekt. In Schritt 2 wird Benutzer X authentifiziert und autorisiert auch den Zugriff von Site A auf die Informationen von Benutzer X auf Site B. In Schritt 4 gibt die Site ihr Geheimnis an Site B zurück und authentifiziert sich selbst sowie den Autorisierungscode, der angibt, wonach sie fragt (das Zugriffstoken von Benutzer X).

Insgesamt handelt es sich bei OAuth 2 um ein sehr einfaches Sicherheitsmodell, bei dem die Verschlüsselung nie direkt ins Spiel kommt. Stattdessen sind sowohl das Secret als auch das Security Token im Wesentlichen Passwörter, und das Ganze ist nur durch die Sicherheit der https-Verbindung gesichert.

OAuth 2 bietet keinen Schutz gegen Wiederholungsangriffe auf das Sicherheits-Token oder das Geheimnis. Stattdessen verlässt es sich ganz darauf, dass Site B verantwortungsvoll mit diesen Elementen umgeht und sie nicht nach außen dringen lässt, und dass sie während der Übertragung über https gesendet werden (https schützt URL-Parameter).

Der Autorisierungscode dient lediglich der Bequemlichkeit, und der Autorisierungscode selbst ist nicht besonders sensibel. Er liefert eine gemeinsame Kennung für das Zugriffstoken von Benutzer X für Site A, wenn Site B nach dem Zugriffstoken von Benutzer X fragt. Nur die Benutzerkennung von Benutzer X auf Site B hätte nicht funktioniert, weil es viele ausstehende Zugangstoken geben könnte, die darauf warten, an verschiedene Sites gleichzeitig ausgegeben zu werden.

30 Stimmen

Sie haben eine wichtige Funktion des Berechtigungscodes übersehen. Warum wird nicht einfach das Refresh-Token (wie Sie das Security Token nennen) sofort zurückgegeben, anstatt den zusätzlichen Schritt zu machen, den Autorisierungscode dafür auszutauschen? Weil das Erfassen des Refresh-Tokens Wiederholungsangriffe ermöglichen würde, während der Autorisierungscode nur einmal verwendet werden kann.

3 Stimmen

OK, @mauricen, das macht Sinn.... Aber könnte der Replay-Angriff nicht genauso gut mit dem Refresh-Token passieren, da dieser bei jeder Anfrage weitergegeben wird?

17 Stimmen

Der Autorisierungscode wird über den Benutzer weitergegeben, könnte also z.B. als Cookie gespeichert werden (siehe stackoverflow.com/questions/4065657/ ). Das Aktualisierungs-Token wird direkt zwischen den beiden Websites übertragen und ist daher viel weniger anfällig.

111voto

Owen Cao Punkte 7530

OAuth ist ein Protokoll, mit dem eine 3-Parteien-App ohne Ihr Konto und Passwort auf Ihre auf einer anderen Website gespeicherten Daten zugreifen kann. Eine offizielle Definition finden Sie im Wiki oder in der Spezifikation.

Hier ist ein Anwendungsfall zu sehen:

  1. Ich melde mich bei LinkedIn an und möchte einige Freunde, die in meinen Gmail-Kontakten sind, verbinden. LinkedIn unterstützt dies. Es wird eine sichere Ressource (meine Gmail-Kontaktliste) von Gmail anfordern. Ich klicke also auf diese Schaltfläche:
    Add Connection

  2. Wenn ich mein Konto und mein Passwort eingebe, wird eine Webseite mit der Anmeldeseite von Google Mail angezeigt:
    Add Connection

  3. Gmail zeigt dann eine Einwilligungsseite an, auf der ich auf "Akzeptieren" klicke: Add Connection

  4. Jetzt kann LinkedIn auf meine Kontakte in Google Mail zugreifen: Add Connection

Nachstehend finden Sie ein Flussdiagramm des obigen Beispiels:

Add Connection

Schritt 1: LinkedIn fordert ein Token vom Autorisierungsserver von Google Mail an.

Schritt 2: Der Gmail-Autorisierungsserver authentifiziert den Eigentümer der Ressource und zeigt dem Benutzer die Zustimmungsseite an. (der Nutzer muss sich bei Google Mail anmelden, wenn er nicht bereits angemeldet ist)

Schritt 3: Der Nutzer gewährt LinkedIn den Zugriff auf die Gmail-Daten.

Schritt 4: Der Google Mail-Autorisierungsserver antwortet mit einem Zugriffstoken.

Schritt 5: LinkedIn ruft die Gmail-API mit diesem Zugriffstoken auf.

Schritt 6: Der Google Mail-Ressourcenserver gibt Ihre Kontakte zurück, wenn das Zugriffstoken gültig ist. (Das Token wird vom Gmail-Ressourcenserver überprüft)

Mehr Details zu OAuth finden Sie unter aquí .

0 Stimmen

Alle Ihre Bilder sind verschwunden. Besteht die Möglichkeit, dass Sie sie auf stack.imgur laden können?

1 Stimmen

Wie kann das richtig sein? Wird dieser Prozess nicht von dem Nutzer initiiert, der vor dem Browser sitzt, und nicht von LinkedIn. Aber Sie geben das als Schritt 3 an. Das ist es, was ich nicht verstehe.

20 Stimmen

Das ist die einfachste Erklärung. Danke, ich werde nie wieder Donuts kaufen

25voto

8bitjunkie Punkte 12117

Abbildung 1, entnommen aus RFC6750 :

     +--------+                               +---------------+
     |        |--(A)- Authorization Request ->|   Resource    |
     |        |                               |     Owner     |
     |        |<-(B)-- Authorization Grant ---|               |
     |        |                               +---------------+
     |        |
     |        |                               +---------------+
     |        |--(C)-- Authorization Grant -->| Authorization |
     | Client |                               |     Server    |
     |        |<-(D)----- Access Token -------|               |
     |        |                               +---------------+
     |        |
     |        |                               +---------------+
     |        |--(E)----- Access Token ------>|    Resource   |
     |        |                               |     Server    |
     |        |<-(F)--- Protected Resource ---|               |
     +--------+                               +---------------+

15voto

Suraj Punkte 1585

So funktioniert Oauth 2.0, gut erklärt in dieser Artikel

enter image description here

0 Stimmen

Können Sie OAUTH2 in Bezug auf die Nichtverwendung von Facebook oder anderen Drittanbietern beschreiben, aber wenn Sie einen geheimen Schlüssel und TOTP-Tokens mit einer Telefonanwendung verwenden, um eine Webanwendung zu sichern?

0 Stimmen

Facebook ist in diesem Beispiel der Autorisierungsserver, der jedem Client ein Zugriffstoken ausstellt, damit dieser auf die Facebook-APIs zugreifen kann. Wenn Sie Ihre APIs absichern wollen, müssen Sie Ihren eigenen Autorisierungsserver implementieren. Dann entscheiden Sie, welchen Grant-Typ Sie verwenden möchten, um Zugriffstoken zu erhalten. Sagen Sie mir, was genau Sie wollen?

0 Stimmen

Ich möchte mit Springboot Security einrichten. Client (Telefon) und Webapp tauschen bei der Registrierung ein Geheimnis aus - dann verwenden Sie Google Authenticator, um einen zeit-/geheimnisbasierten Code zu generieren, der bei der Anmeldung zusätzlich zum Passwort eingegeben wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X