Vor kurzem konnte ich MD5-Authentifizierung für XMPP-Streams in Swift IOS gemäß den Anweisungen auf den folgenden zwei Websites (ich verwendete die CC-MD5-Funktion von Apples CommonCrypto C-Bibliothek für die tatsächliche Hashing) erhalten:
Ich bin auf der Suche nach einer ähnlichen Erklärung dafür, wie andere Hashed-SASL-Authentifizierungsschemata funktionieren, insbesondere SCRAM-SHA1. Ich habe das offizielle Dokument RFC5802 gefunden, aber ich habe große Schwierigkeiten, es zu verstehen (es ist auch nicht spezifisch für XMPP) ). Ich würde eine einfachere Erklärung oder einen einfach lesbaren Code (C, PHP, C ++, Javascript, Java) für die XMPP-Authentifizierung schätzen, der keine Bibliotheken für etwas anderes als das eigentliche Hashing verwendet.
Ich bin daran interessiert, den Prozess zu verstehen und suche nicht nach dem ios XMPP-Framework. Jede Hilfe wäre willkommen.
Der grundlegende Überblick darüber, wie dieser Mechanismus funktioniert, ist:
Die kryptografischen Algorithmen, die Sie benötigen, sind SHA-1, HMAC mit SHA-1 und PBKDF2 mit SHA-1 . Sie sollten nachschlagen, wie Sie sie in Ihrer Sprache / Ihrem Framework verwenden können, da ich nicht empfehle, sie von Grund auf neu zu implementieren.
normalizedPassword
. Dies stellt sicher, dass die UTF8-Kodierung keine Variationen desselben Passworts enthalten kann. clientNonce
. initialMessage
ist "n=" .. username .. ",r=" .. clientNonce
(Ich verwende ..
für die Verkettung von Strings). Der Client setzt den GS2-Header ( "n,,"
) auf initialMessage und base64-codiert das Ergebnis. Es sendet dies als seine erste Nachricht:
Der Server antwortet mit einer Herausforderung. Die Daten der Challenge sind Base64-codiert:
%Vor%Der Client base64 dekodiert es:
%Vor%Der Client analysiert dies:
r=
Dies ist die serverNonce
. Der Client MUSS sicherstellen, dass er mit der clientNonce
beginnt, die er in seiner ursprünglichen Nachricht gesendet hat. s=
Dies ist das salt
, base64-codiert (ja, das ist zweimal base64-kodiert!) i=
Dies ist die Anzahl der Iterationen, i
. Der Client berechnet:
%Vor% Der Client base64 codiert clientFinalMessage
und sendet es als Antwort:
Wenn alles gut gegangen ist, erhalten Sie eine <success>
Antwort vom Server:
Base64 dekodiert dies enthält:
%Vor% Der Client MUSS sicherstellen, dass der Wert von v
die base64-Codierung von serverSignature
ist.
Dies ist die Grundversion des Algorithmus. Sie können es erweitern, um zu tun:
Hash-Speicher Wenn der Server immer dieselben salt
- und i
-Werte sendet, kann der Client nur saltedPassword
anstelle des Benutzerkennworts speichern. Dies ist sicherer (da der Client das Passwort nicht speichern muss, sondern nur einen schwer zu reversierenden gesalzenen Hash) und schneller, da der Client nicht jedes Mal die gesamte Tastenspannung ausführen muss.
Der Server kann auch Hash-Speicher verwenden: Der Server kann nur salt
, i
, storedKey
und serverKey
speichern. Weitere Informationen zu diesem hier .
Einige häufige Fallstricke:
salt
an (wenn du sie erzeugst, stelle sicher, dass sie lang genug und kryptographisch zufällig sind). salt
ist base64-codiert und kann beliebige Daten enthalten (eingebettet in NUL
s). initialMessage
-Teil von authMessage
enthält nicht den GS2-Header (in den meisten Situationen ist dies "n,,"
). Wenn Sie Ihre Implementierung testen möchten, hier sind alle Zwischenergebnisse für das Beispiel aus dem RFC:
Benutzername: user
Passwort: pencil
Der Client generiert das zufällige nonce fyko+d2lbbFgONRv9qkxdawL
Erste Nachricht: n,,n=user,r=fyko+d2lbbFgONRv9qkxdawL
Server generiert die zufällige Nonce 3rfcNHYJY1ZVvWVs7j
Server antwortet: r=fyko+d2lbbFgONRv9qkxdawL3rfcNHYJY1ZVvWVs7j,s=QSXCR+Q6sek8bf92,i=4096
Das Salz (hex): 4125c247e43ab1e93c6dff76
Letzte Nachricht des Clients: c=biws,r=fyko+d2lbbFgONRv9qkxdawL3rfcNHYJY1ZVvWVs7j
Gesalzenes Passwort (hex): 1d96ee3a529b5a5f9e47c01f229a2cb8a6e15f7d
Client-Schlüssel (hex): e234c47bf6c36696dd6d852b99aaa2ba26555728
Gespeicherter Schlüssel (hexadezimal): e9d94660c39d65c38fbad91c358f14da0eef2bd6
Auth-Nachricht: n=user,r=fyko+d2lbbFgONRv9qkxdawL,r=fyko+d2lbbFgONRv9qkxdawL3rfcNHYJY1ZVvWVs7j,s=QSXCR+Q6sek8bf92,i=4096,c=biws,r=fyko+d2lbbFgONRv9qkxdawL3rfcNHYJY1ZVvWVs7j
Client-Signatur (hex): 5d7138c486b0bfabdf49e3e2da8bd6e5c79db613
Clientproof (hex): bf45fcbf7073d93d022466c94321745fe1c8e13b
Serverschlüssel (hex): 0fe09258b3ac852ba502cc62ba903eaacdbf7d31
Serversignatur (hexadezimal): ae617da6a57c4bbb2e0286568dae1d251905b0a4
Letzte Nachricht des Clients: c=biws,r=fyko+d2lbbFgONRv9qkxdawL3rfcNHYJY1ZVvWVs7j,p=v0X8v3Bz2T0CJGbJQyF0X+HI4Ts=
Letzte Nachricht des Servers: v=rmF9pqV8S7suAoZWja4dJRkFsKQ=
Server-Server-Signatur (hex): ae617da6a57c4bbb2e0286568dae1d251905b0a4
Tags und Links authentication xmpp sasl sasl-scram