SSHA jest solonym SHA-1. Domyślnie ostatnie 4 bajty to sól. Dane wyjściowe slappasswd to
'{<Hash Method>}<base64 converted hash and salt>'
Aby więc sprawdzić, czy hasło w postaci zwykłego tekstu jest równe solonemu SHA, musisz:
- usuń specyfikator metody skrótu za pomocą np. sed.
- dekodować ciąg base64
- wyodrębnij 4 ostatnie bajty, to jest sól
- połącz sól z zwykłym hasłem tekstowym
- haszysz to
- porównać
Ciąg dekodowany base64 zawiera skrót w postaci binarnej i nie można go wydrukować, więc przekonwertujemy go na szesnastkowy za pomocą od. Pierwsze 3 kroki są wykonywane przez następujący kod:
#!/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"
Dane wyjściowe mogą być:
{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;▒
Więc teraz musimy połączyć sól z hasłem w postaci zwykłego tekstu i haszować je, tym razem bez solenia! Problem, który miałem, polegał na zrozumieniu, że solą może być naprawdę każda postać, w tym znaki niedrukowalne. Aby połączyć te niedrukowalne znaki, użyjemy printf i ich reprezentacji szesnastkowych:
slappasswd -h {SHA} -s $(printf 'password\xd3\x62\x3b\x87') | sed 's/{SHA}//' | base64 -d | od -A n -t x1
Dane wyjściowe to:
7c 3b b4 3e 02 83 9f 50 e2 f5 6d 47 30 83 69 3d 74 6a 43 d8
Co jest równe hashowi powyżej. Teraz sprawdziliśmy, czy „hasło” pasuje do solonej SHA.
Dzięki i dalsze czytanie: http://cpansearch.perl.org/src/GSHANK/Crypt-SaltedHash-0.09/lib/Crypt/SaltedHash.pm
slappasswd
jest {SSHA} lub solona wersja SHA-1.