XMPP-SASL SCRAM-SHA1-Authentifizierung
Kürzlich war ich in der Lage, um die MD5-Authentifizierung funktioniert für XMPP-streams im Swift-IOS Folgen Sie den Anweisungen auf den folgenden zwei Seiten (ich habe die CC-MD5-Funktion von Apple ist CommonCrypto C-Bibliothek für die eigentliche hashing):
http://wiki.xmpp.org/web/SASLandDIGEST-MD5
http://www.deusty.com/2007/09/example-please.html
Ich bin auf der Suche nach einer ähnlichen Erklärung dafür, wie man andere Hash-SASL-Authentifizierungs-Systeme arbeiten, besonders SCRAM-SHA1. Ich habe mit der offiziellen RFC5802 Dokument, aber ich habe eine Menge von Schwierigkeiten zu verstehen (es ist nicht spezifisch für XMPP entweder). Ich würde mich über eine einfachere Erklärung oder einige einfach lesbaren code (C, PHP, C++, Javascript, Java), spezifisch für XMPP-Authentifizierung nicht verwenden, - Bibliotheken für alles andere als die tatsächliche Vermischung.
Ich bin daran interessiert, den Prozess verstehen und bin nicht auf der Suche zu verwenden, die ios XMPP-Framework. Jede Hilfe würde geschätzt werden.
- Schritt 1. Suche für ein open-source-XMPP-Bibliothek/ - Implementierung, implementiert SCRAM. Schritt 2. Blick in den code. Sie kostenlos zu benutzen den open-source-code oder erstellen Derivat arbeiten, solange Sie gehorchen den Bedingungen der Lizenz des Codes.
Du musst angemeldet sein, um einen Kommentar abzugeben.
SCRAM-SHA-1
Den grundlegenden ü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. Sollten Sie nachschlagen, wie Sie in Ihrer Sprache/framework, wie ich es nicht empfehlen, implementieren Sie von Grund auf.
Im detail
normalizedPassword
. Dies ist, um sicherzustellen, die UTF8-Kodierung nicht enthalten, Variationen des gleichen Passwort.clientNonce
.initialMessage
ist"n=" .. username .. ",r=" .. clientNonce
(ich bin mit..
für die string-Verkettung).Client stellt die GS2-header (
"n,,"
) der initialMessage und base64-kodiert das Ergebnis. Sendet er diese als seine erste Nachricht:Der server antwortet mit einer Herausforderung. Die Daten der Herausforderung base64-codiert:
Client base64-dekodiert es:
Den client analysiert diese:
r=
Dies ist dieserverNonce
. Der Kunde MUSS sicherstellen, dass es beginnt mit derclientNonce
es geschickt in seine erste Nachricht.s=
Dies ist diesalt
, base64-codiert (ja, das ist die base64-codierte zweimal!)i=
Dies ist die Anzahl der Iterationeni
.Dem client berechnet:
Client base64-kodiert die
clientFinalMessage
und sendet es als Antwort:Wenn alles gut gegangen ist, erhalten Sie eine
<success>
Antwort vom server:Base64-dekodiert diese enthält:
MUSS der AUFTRAGGEBER sicherstellen, dass der Wert von
v
ist die base64-Kodierung derserverSignature
.Extras
Dies ist die Basis-version des Algorithmus. Sie können erweitern, es zu tun:
Hash-Speicher. Wenn der server schickt immer die gleichen
salt
undi
Werte, dann kann der client speichert nursaltedPassword
anstatt das Passwort des Benutzers. Dies ist sicherer (als wenn der client nicht speichern müssen Sie das Passwort nur schwer umzukehren salted hash) und schneller als der client muss nicht alle key-stretching jedes mal.Dem server können auch Hash-Speicher: der server kann den Shop nur
salt
,i
,storedKey
undserverKey
. Mehr Infos hier.Fallstricke
Einige häufige Fehlerquellen:
salt
(obwohl, wenn Sie Sie erstellen, stellen Sie sicher, Sie sind lang genug und kryptografisch zufälligen).salt
base64-codiert und können beliebige Daten enthalten (embeddedNUL
s).initialMessage
Teil derauthMessage
nicht enthalten GS2-header (in den meisten Situationen ist dies"n,,"
).Testvektoren
Wenn Sie möchten, testen Sie Ihre Implementierung, hier sind alle vorläufigen Ergebnisse für das Beispiel aus dem RFC:
Benutzername:
user
Passwort:
pencil
Client erzeugt zufälligen nonce
fyko+d2lbbFgONRv9qkxdawL
Erste Nachricht:
n,,n=user,r=fyko+d2lbbFgONRv9qkxdawL
Server erzeugt die zufällige nonce
3rfcNHYJY1ZVvWVs7j
Server antwortet:
r=fyko+d2lbbFgONRv9qkxdawL3rfcNHYJY1ZVvWVs7j,s=QSXCR+Q6sek8bf92,i=4096
Salz (hex):
4125c247e43ab1e93c6dff76
Client endgültige Nachricht bare:
c=biws,r=fyko+d2lbbFgONRv9qkxdawL3rfcNHYJY1ZVvWVs7j
Gesalzene Kennwort (hex):
1d96ee3a529b5a5f9e47c01f229a2cb8a6e15f7d
Client-Schlüssel (hex):
e234c47bf6c36696dd6d852b99aaa2ba26555728
Gespeicherten Schlüssel (hex):
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
Client-Beleg (hex):
bf45fcbf7073d93d022466c94321745fe1c8e13b
Server-Schlüssel (hex):
0fe09258b3ac852ba502cc62ba903eaacdbf7d31
Server-Signatur (hex):
ae617da6a57c4bbb2e0286568dae1d251905b0a4
Client-Letzte Meldung:
c=biws,r=fyko+d2lbbFgONRv9qkxdawL3rfcNHYJY1ZVvWVs7j,p=v0X8v3Bz2T0CJGbJQyF0X+HI4Ts=
Server Letzte Nachricht:
v=rmF9pqV8S7suAoZWja4dJRkFsKQ=
Server die server-Signatur (hex):
ae617da6a57c4bbb2e0286568dae1d251905b0a4