Slappasswd Ausgabe randomisiert

10

Ich hatte erwartet slappasswd, einen festen Hash zu erzeugen, aber es scheint, dass die Ausgabe zufällig ist, da ich nie dieselbe Ausgabe für dasselbe Eingabekennwort erhalte:

$ slappasswd -s secret
{SSHA}mCXsPZkfgQYZr2mKHpy5Iav+2S2XlVU3
$ slappasswd -s secret
{SSHA}62oXsalJBuopYfHhi6hGp6AESuWNIVnd
$ slappasswd -s secret
{SSHA}0Ulc8+ugMi3NbTtWnclOFW1LKCqRdsT8

Woher weiß slapd während der Authentifizierung, wie der Hash für das angegebene Passwort auf dieselbe Weise randomisiert wird, damit er mit dem ursprünglich definierten Passwort übereinstimmt?

Max
quelle

Antworten:

9

Ich gehe hier auf die Beine, aber ich gehe davon aus, dass slappasswd einen gesalzenen Hash anstelle eines einfachen Hash verwendet. Dies bedeutet, dass Ihrem Kennwort ein zufälliges Präfix hinzugefügt wird und dieses zufällige Präfix als Teil der Zeichenfolge gespeichert wird, die in der Ausgabe von slappasswd angezeigt wird. Wenn Sie Ihr Kennwort eingeben, wird das Präfix hinzugefügt, das Ergebnis gehasht und mit der Zeichenfolge in der Ausgabe von slappasswd verglichen. Wenn es übereinstimmt, sind Sie dabei. Wenn dies nicht der Fall ist, war Ihr Passwort falsch :)

wzzrd
quelle
3
Tatsächlich. Insbesondere ist die Standard-Hash-Methode für slappasswd{SSHA} oder die gesalzene Version von SHA-1.
Justarobert
Ich stimme zu, aber meine Frage bleibt: Wenn das Salz als Teil des Hashs endet, bedeutet dies, dass Sie das Salz nicht aus dem Hash-Passwort extrahieren können. Woher weiß slapd dementsprechend, welches Salz bei der Passwortüberprüfung hinzugefügt werden muss? (Es muss dasselbe Salz hinzugefügt werden, damit die gehashten Passwörter identisch sind.)
Max
3
@user: Der nachfolgende Teil {SSHA}enthält sowohl das Salz als auch den Hash.
user1686
8

SSHA ist ein gesalzenes SHA-1. Standardmäßig sind die letzten 4 Bytes das Salz. Die Ausgabe von slappasswd ist

'{<Hash Method>}<base64 converted hash and salt>'

Um zu testen, ob ein Nur-Text-Passwort dem gesalzenen SHA entspricht, müssen Sie:

  1. Entfernen Sie den Hash-Methodenspezifizierer mit z. B. sed.
  2. Dekodieren Sie die Base64-Zeichenfolge
  3. extrahiere die letzten 4 Bytes, das ist das Salz
  4. Verketten Sie das Salt mit dem Klartext-Passwort
  5. hat geschlagen
  6. vergleichen Sie

Die base64-decodierte Zeichenfolge enthält den Hash in binärer Form und kann nicht gedruckt werden. Daher konvertieren wir ihn mit od in hex. Die ersten drei Schritte werden mit dem folgenden Code ausgeführt:

#!/bin/bash
output=$(slappasswd -h {SSHA} -s password)
hashsalt=$( echo -n $output | sed 's/{SSHA}//' | base64 -d)
salt=${hashsalt:(-1),(-4)}
echo $output
echo $(echo -n $hashsalt | od -A n -t x1)
echo "Salt: $salt"

Die Ausgabe könnte sein:

{SSHA}fDu0PgKDn1Di9W1HMINpPXRqQ9jTYjuH

7c 3b b4 3e 02 83 9f 50 e2 f5 6d 47 30 83 69 3d 74 6a 43 d8 d3 62 3b 87
<------------------------- Hash --------------------------> <-- Salt-->

Salt: ▒b;▒

Jetzt müssen wir das Salt mit dem Klartext-Passwort verketten und es hashen, diesmal ohne zu salzen! Das Problem, das ich hatte, war zu verstehen, dass das Salz wirklich jedes Zeichen sein kann, einschließlich nicht druckbarer Zeichen. Um diese nicht druckbaren Zeichen zu verketten, verwenden wir printf und ihre hexadezimalen Darstellungen:

slappasswd -h {SHA} -s $(printf 'password\xd3\x62\x3b\x87') | sed 's/{SHA}//' | base64 -d | od -A n -t x1

Die Ausgabe ist:

7c 3b b4 3e 02 83 9f 50 e2 f5 6d 47 30 83 69 3d 74 6a 43 d8

Welches ist gleich dem Hash oben. Jetzt haben wir überprüft, dass 'Passwort' mit dem gesalzenen SHA übereinstimmt.

Vielen Dank und weiterführende Literatur: http://cpansearch.perl.org/src/GSHANK/Crypt-SaltedHash-0.09/lib/Crypt/SaltedHash.pm

mxmlnkn
quelle