close

SCRAM

Zur Navigation gehen Zur Suche gehen

SCRAM ist ein Datenspeichermechanismus und ein Kennwortauthentifizierungsprotokoll . _ _ _ _ _ _ _ _ _ SCRAM gehört zu den SASL -Level-Mechanismen, wodurch es möglich ist, es zusammen mit einigen der Standardprotokolle zu verwenden, die SASL verwenden: SMTP , LDAP , IMAP und POP . Scram ist auch ein GSS-API- Mechanismus. Unterstützt Kanalbindung und bidirektionale Authentifizierung. Zum Zeitpunkt des Schreibens dieses Artikels (Januar 2013) ist es das fortschrittlichste und funktionsreichste.

Hintergrund

  • Die Notwendigkeit eines Mechanismus, der alle in SASL beschriebenen neuen Funktionen unterstützt: Unterstützung für internationalisierte Logins und Passwörter, Unterstützung für die Implementierung einer eindeutigen Authentifizierung, Unterstützung für die Kanalbindung [1] .
  • Die Notwendigkeit eines Zwei-Wege-Authentifizierungsprotokolls [2] .
  • Der Wunsch, dass die in der Identifikationsdatenbank gespeicherten Informationen für einen Angreifer nicht ausreichen, um sich als Client auszugeben.
  • Die Notwendigkeit, dass der Server nicht in der Lage sein darf, einen Client für einen anderen Server zu imitieren (mit Ausnahme des Autorisierungsproxys ).
  • Es besteht ein erheblicher Bedarf an einem Mechanismus, der einfacher zu implementieren ist als der derzeitige (DIGEST-MD5) [2] .

Im Allgemeinen spiegeln alle Annahmen die Mängel anderer Authentifizierungsmechanismen wider. Daher wurde im Juni 2010 SCRAM geschaffen, das frei von den Problemen anderer Mechanismen ist und den Anforderungen seiner Zeit entspricht [3] .

Allgemeines Schema

Betrachten Sie unten eine Beschreibung eines vollständigen nicht komprimierten SASL-SCRAM-Authentifizierungsdatenaustauschs.

Für die folgende Beschreibung des Pseudocodes des Algorithmus wird folgende Notation verwendet:

  • " :=": Die Variable auf der linken Seite bezeichnet eine Folge von Acht-Bit- Bytes , die sich aus der Auswertung des Ausdrucks auf der rechten Seite ergeben.
  • " +": Verkettung von Byte-Strings.
  • " [ ]": Teil des in "[" und "]" eingeschlossenen Ausdrucks kann unter Umständen nicht in das Ergebnis aufgenommen werden. Solche Umstände werden separat beschrieben.
  • Normalize(str): Implementierung einer im SASLprep [4] -Standard beschriebenen Funktion, die den „stringprep“-Algorithmus als Normalisierungsalgorithmus für die UTF-8-str codierte Zeichenfolge „ “ [5] ausführt . Das Ergebnis der Funktion ist ebenfalls ein in UTF-8 codierter String.
  • HMAC(key, str): Eine Implementierung der HMAC - Funktion, die eine Folge von Bytes als Eingabe empfängt key und strausgibt, mit der Sie die Integrität der Informationen überprüfen können.
  • H(str): eine Implementierung einer Hash - Funktion, die eine Zeichenfolge als Eingabe verwendet und als Ergebnis der Arbeit eine Folge von Bytes erzeugt, deren Länge von der Funktion selbst abhängt.
  • XOR: Bitkomplement .
  • Funktion
 Hi ( str ,  salt ,  i ) : 
  U1  :=  HMAC ( str ,  salt  +  INT ( 1 )) 
  U2  :=  HMAC ( str ,  U1 ) 
  
  Ui - 1  :=  HMAC ( str ,  Ui - 2 ) 
  Ui  :=  HMAC ( str ,  Ui - 1 ) 
  Hi  :=  U1  XOR  U2  XOR   XOR  Ui

wobei „ i“ die Iterationsnummer ist, „ +“ der Zeilensummenoperator ist und INT(g) eine Vier-Byte-Darstellung einer Ganzzahl gist (das erste Oktett ist das signifikanteste), salt - dies ist ein kryptografisches Salt . Tatsächlich Hi()ist es im Wesentlichen ein Pseudo-Zufallszahlengenerator und entspricht praktisch einem PBKDF2 - Ausgangsblock .

Vor Beginn des Vorgangs stehen dem SCRAM-Client ein Benutzername und ein Passwort zur Verfügung. Der Client sendet den Benutzernamen an den Server, der die den empfangenen Daten entsprechenden Informationen ( salt, StoredKey, ServerKey, ) aus der Datenbank abruft . iDer Server sendet auch saltden Iterationszähler an den Client, der die Werte der folgenden Werte berechnet und an den Server sendet ClientProof. [3]

      SaltedPassword   :=  Hi ( Normalize ( password ) ,  salt ,  i ) 
      ClientKey        :=  HMAC ( SaltedPassword ,  " Client  Key " ) 
      StoredKey        :=  H ( ClientKey ) 
      AuthMessage      :=  client - first - message - bare  +  " , "  +  server - first - message  +  " , "  +  client - final - message - without - proof 
      ClientSignature  :=  HMAC ( StoredKey ,  AuthMessage ) 
      ClientProof      :=  ClientKey  XOR  ClientSignature 
      ServerKey        :=  HMAC ( SaltedPassword ,  " Server  Key " ) 
      ServerSignature  :=  HMAC ( ServerKey ,  AuthMessage )

Der Server authentifiziert den Client durch Auswerten ClientSignatureund anschließendes XORing mit ClientProof, Wiederherstellen ClientKeyund Validieren ClientKeydurch Anwenden einer Hash-Funktion und Vergleichen des Ergebnisses mit StoredKey. Wenn ClientKeyes richtig ist, beweist es, dass der Client Zugriff auf das Passwort des Benutzers hat [3] .

In ähnlicher Weise authentifiziert der Client den Server, indem er die ServerSignatur berechnet und mit dem vom Server gesendeten Wert vergleicht. Wenn sie gleich sind, beweist dies, dass der Server Zugriff auf den ServerKeyBenutzer hatte.

AuthMessagewird durch Kombinieren der Nachrichten berechnet, die am Authentifizierungsaustausch teilgenommen haben.

Somit erlaubt Ihnen SCRAM, einen Benutzer mit seinem Namen und Passwort gegenüber dem Server zu authentifizieren, und erlaubt Ihnen, den Server für den Client zu authentifizieren, aber der Server ist unbenannt [3] .

Ein solches Schema legt nahe, dass das Geheimnis in diesem Fall ist:

  • gehashte Werte StoredKeyundServerKey
  • Salzwert
  • Iterationsparameter [2]

Ein Beispiel für einen Dialog zwischen dem Server „S“ und dem Client „C“ während des Authentifizierungsprozesses:

   C: n,,n=Benutzer,r=fyko+d2lbbFgONRv9qkxdawL
   S: r=fyko+d2lbbFgONRv9qkxdawL3rfcNHYJY1ZVvWVs7j,s=QSXCR+Q6sek8bf92,
      i=4096
   C: c=biws,r=fyko+d2lbbFgONRv9qkxdawL3rfcNHYJY1ZVvWVs7j,
      p=v0X8v3Bz2T0CJGbJQyF0X+HI4Ts=
   S: v=rmF9pqV8S7suAoZWja4dJRkFsKQ=

Zuverlässigkeit des Mechanismus

In Fällen, in denen SCRAM ohne zusätzliche Sicherheitsebene wie TLS verwendet wird, kann ein passiver Abfangjäger genügend Informationen erhalten, um offline eine vollständige Suche nach seinem Passwort zu organisieren . Die zum Knacken eines Passworts benötigte Zeit hängt von der verwendeten kryptografischen Hash-Funktion und der Komplexität des Passworts ab. Die äußere Netzwerksicherheitsschicht verhindert diesen Angriff [3] .

In Netzwerken mit TLS kann der Portbindungsmechanismus verwendet werden, um einen Man-in-the-Middle- Angriff zu erkennen . Der Angreifer hat jedoch die Möglichkeit für einen Offline-Brute-Force-Angriff.

Falls Authentifizierungsinformationen aus der Authentifizierungsdatenbank gestohlen werden, kann ein Brute-Force-Angriff verwendet werden, um das Passwort des Benutzers zu erhalten. Das verwendete Salz mildert die Auswirkungen dieses Angriffs, indem es erzwingt, dass jedes Passwort einzeln erraten wird [3] .

Es ist wichtig, dass die Effektivität jedes passwortbasierten Authentifizierungsmechanismus stark von der Einhaltung der Passwortrichtlinie durch den Benutzer abhängt.

In der Praxis ist SCRAM einer der sichersten passwortbasierten Authentifizierungsmechanismen [2] .

Andere Authentifizierungsmechanismen

  • Der DIGEST-MD5-Mechanismus ist sehr schwierig zu implementieren und zu testen, was ihn schlecht kompatibel macht. Das darin enthaltene Sicherheitsniveau wird häufig nicht implementiert. Stattdessen ist TLS weit verbreitet [6] .
  • Der CRAM-MD5-SASL-Mechanismus hat trotz seiner weit verbreiteten Verwendung auch seine eigenen Probleme. Insbesondere fehlen einige der neuen SASL-Funktionen, wie die Möglichkeit, internationale Logins und Passwörter zu verwenden. Ebenfalls fehlen Server-Authentifizierung und Channel-Binding-Fähigkeiten [7] .
  • Der PLAIN SASL-Mechanismus ermöglicht einen Authentifizierungs-Hijacking-Angriff und die Übertragung auf einen anderen Server, auf dem der Benutzer dasselbe Passwort hat. Sendet das Passwort im Klartext, wenn das Netzwerk kein TLS verwendet [8] .

Vorteile von SCRAM

  • Authentifizierungsinformationen werden in einer speziellen Datenbank gespeichert. Diese Informationen reichen nicht aus, um sich gegenüber einem anderen Server als Client darzustellen.
  • Auf alle Informationen in der Datenbank wird ein Salt angewendet, wodurch eine Iteration über das Wörterbuch verhindert wird .
  • Der Mechanismus ermöglicht die Verwendung eines Autorisierungs-Proxy-Servers, ohne dass der Proxy-Server Superuser -Rechte auf dem Server haben muss.
  • Zwei-Wege-Authentifizierung wird unterstützt, aber gleichzeitig hat nur der Client einen Namen (der Server wird nicht durch den Namen identifiziert).
  • Bei Verwendung als SASL-Mechanismus ist SCRAM auch in der Lage, Anmeldeinformationen vom Client an den Server weiterzugeben.
  • Der Einfachheit halber enthält SCRAM keine Aushandlung der Sicherheitsstufe. Es soll mit einer äußeren Sicherheitsschicht verwendet werden, die von TLS oder SSH [3] bereitgestellt wird .
  • Es wurde für die Verwendung mit jedem beliebigen Hash-Algorithmus entwickelt und hat daher ein großes Potenzial, die kryptografische Stärke des Schemas zu verbessern. SHA-1 sollte während der Entwicklung verwendet werden [2]

Da SCRAM erstellt wurde, um die Mängel der vorangegangenen Mechanismen zu beheben, sind die oben beschriebenen Probleme nicht inhärent (sein Hauptvorteil ist das Fehlen von Mängeln).

Es ist erwähnenswert, dass SCRAM zwar ein reiner SASL-Mechanismus ist, gleichzeitig aber die Anforderungen für den GSS-API-Mechanismus [3] [2] vollständig erfüllt .

Passwortlose Authentifizierung

Ein passwortbasiertes Sicherheitsschema beruht auf einem gemeinsamen Geheimnis, das beiden Parteien bekannt ist. Dies führt zu Schwierigkeiten bei der Verwaltung von Sicherheitseinstellungen zwischen vielen Teilen des Systems. Dadurch entsteht auch das Problem, geheime Informationen an verschiedene Stellen zu liefern. Für PKI kann ein privater Schlüssel sehr sicher gesichert werden, beispielsweise indem er auf einer Smartcard gespeichert wird, was einen zusätzlichen Authentifizierungs- und Sicherheitsfaktor bietet.

PKI-basierte starke Authentifizierung ist die beste Wahl für:

  • Server-zu-Server-Authentifizierung
  • Benutzer-zu-Benutzer-Authentifizierung
  • Authentifizierung mit hoher Sicherheit

Die passwortbasierte Authentifizierung ist besser, weil

  • der Hardware-Ansatz zur Authentifizierung ist viel teurer [2] .

Notizen

Literatur