Was ist Digest-Authentifizierung?

101

Wie unterscheidet sich die Digest-Authentifizierung von der Standardauthentifizierung, abgesehen vom Senden von Anmeldeinformationen als einfacher Text?

SoftwareGeek
quelle
1
Tolle Erklärung von @Gumbo hier: stackoverflow.com/a/5288679/591487
inorganik
2
Etwas, das Sie NIEMALS verwenden sollten. Schützt das Passwort während der Übertragung nicht und erfordert, dass der Server Passwörter im Klartext speichert.
CodesInChaos
2
Digest bietet eine bessere Sicherheit während des Transports als die Standardauthentifizierung für unverschlüsselten Datenverkehr, ist jedoch schwach. Es ist VIEL sicherer, stattdessen die Standardauthentifizierung in Kombination mit SSL / TLS zu verwenden, da Sie auf diese Weise auch die Kennwörter auf dem Server verschlüsselt halten können.
Rustyx

Antworten:

178

Der Hauptunterschied besteht darin, dass der Benutzername und das Kennwort nicht im Klartext über die Leitung gesendet werden müssen. Es ist auch immun gegen Wiederholungsangriffe, da es eine einmalige Nummer vom Server verwendet.

Der Server gibt dem Client eine einmalige Verwendungsnummer (Nonce), die er mit dem Benutzernamen, dem Realm, dem Kennwort und der URI-Anforderung kombiniert. Der Client führt alle diese Felder über eine MD5-Hashing-Methode aus, um einen Hash-Schlüssel zu erstellen.

Dieser Hash-Schlüssel wird zusammen mit dem Benutzernamen und dem Realm an den Server gesendet, um zu versuchen, sich zu authentifizieren.

Serverseitig wird dieselbe Methode zum Generieren eines Hashkeys verwendet. Statt das im Browser eingegebene Kennwort zu verwenden, sucht der Server das erwartete Kennwort für den Benutzer in seiner Benutzer-DB. Es sucht das gespeicherte Passwort für diesen Benutzernamen, führt denselben Algorithmus durch und vergleicht es mit dem, was der Client gesendet hat. Wenn sie übereinstimmen, wird der Zugriff gewährt, andernfalls kann ein 401 Unauthorized (kein Login oder fehlgeschlagenes Login) oder ein 403 Forbidden (Zugriff verweigert) zurückgesendet werden.

Die Digest-Authentifizierung ist in RFC2617 standardisiert . Es gibt einen schönen Überblick darüber auf Wikipedia :

Sie können sich das so vorstellen:

  1. Kunde macht Anfrage
  2. Der Client erhält eine Nonce vom Server und eine 401-Authentifizierungsanforderung zurück
  3. Der Client sendet das folgende Antwortarray zurück (Benutzername, Realm, generate_md5_key (Nonce, Benutzername, Realm, URI, Passwort_Gegeben_von_Benutzer_zu_Browser)) (ja, das ist sehr vereinfacht).
  4. Der Server verwendet den Benutzernamen und den Realm (und kennt den vom Client angeforderten URI) und sucht nach dem Kennwort für diesen Benutzernamen. Dann geht es und macht seine eigene Version von generate_md5_key (Nonce, Benutzername, Realm, URI, Passwort_I_have_for_this_user_in_my_db)
  5. Es vergleicht die Ausgabe von generate_md5 () mit der vom Client gesendeten, wenn sie mit dem vom Client gesendeten Kennwort übereinstimmt. Wenn sie nicht übereinstimmen, war das gesendete Passwort falsch.
Ian C.
quelle
Schöne Erklärung. Sind der Benutzername & pwd für einen Windows-Benutzer? Woher kommen sie?
SoftwareGeek
Sie sind unabhängig davon, was der Benutzer in den Browser eingibt. Das Kennwort muss mit dem übereinstimmen, was der Server für das Kennwort für diesen Benutzer gespeichert hat. Wahrscheinlich ist es etwas Spezielles für diese Webanwendung und nicht Ihr Windows-Passwort. Dies hängt stark von der Art und Weise ab, wie die Webanwendung zusammengestellt wird.
Ian C.
14
Diese Antwort ist 6 Jahre alt, aber ich denke, alle sicherheitsbewussten Systeme speichern Passwörter inzwischen in einem Salted-Hash-Format. Es gibt keine Methode, und es sollte keine geben, um das ursprüngliche Passwort aus der Datenbank zu erhalten, was eine Digest-Autorisierung unmöglich macht.
Ramon de Klein
3
Wenn der Digest-Hash von Benutzername und Passwort in der Datenbank anstelle von einfachen Passwörtern gespeichert ist, ist es weiterhin möglich, den Digest auth @RamondeKlein
karakays
1
@BlueBockser Ich denke, Karakays bedeutete, dass anstelle der Verwendung eines einfachen Passworts ein Hash, der sich aus der Kombination von Benutzername und Passwort ergibt, bei der Anmeldung auf dem Server gespeichert und vor der Authentifizierung auf der Clientseite berechnet werden sollte. Dies kann auch mit nur einem Hash des Passworts erfolgen.
logo_writer
14

Ein Hash der Anmeldeinformationen wird über die Leitung gesendet.

HA1 = MD5(username:realm:password)

Wikipedia hat einen ausgezeichneten Artikel zu diesem Thema

Philip Fourie
quelle
vom Client zum Server? Könnten Sie bitte Schritte für die Interaktion angeben? Wikipedia-Artikel ist gut, aber ich brauche eine bessere Erklärung oder ein besseres Beispiel.
SoftwareGeek
Ja, der Client generiert den Hashwert und sendet ihn an den Server. Der Wikipedia-Artikel beschreibt das Protokoll im Detail. Ich schlage vor, dass Sie für weitere Informationen darauf verweisen.
Philip Fourie
1

Die einzige Möglichkeit, den Hash HA1 der Anmeldeinformationen abzurufen, besteht darin, das Kennwort zu kennen. Der Server kennt HA1, aber nicht das Passwort, das es generiert hat. Wenn HA1 einem Angreifer bekannt wäre, könnte es in das System gelangen. Es wird also nicht über den Draht geschickt. Zuvor wird ein weiterer auf Nonce usw. basierender Hash durchgeführt, der mit einer ähnlichen Berechnung auf dem Server übereinstimmen muss. Somit ist das System sicher, solange der Server HA1 privat hält.

Chris Oakley
quelle
Dies ist die Erklärung für die Digest-Authentifizierung, bei der das Passwort nicht im Klartext gesendet wird (was bei Basic Auth der Fall ist)
Erik Oppedijk