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:
- Entfernen Sie den Hash-Methodenspezifizierer mit z. B. sed.
- Dekodieren Sie die Base64-Zeichenfolge
- extrahiere die letzten 4 Bytes, das ist das Salz
- Verketten Sie das Salt mit dem Klartext-Passwort
- hat geschlagen
- 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
slappasswd
{SSHA} oder die gesalzene Version von SHA-1.