Spodziewałem slappasswd
się stworzyć stały skrót, ale wygląda na to, że dane wyjściowe są losowe, ponieważ nigdy nie otrzymuję tego samego wyniku dla tego samego hasła wejściowego:
$ slappasswd -s secret
{SSHA}mCXsPZkfgQYZr2mKHpy5Iav+2S2XlVU3
$ slappasswd -s secret
{SSHA}62oXsalJBuopYfHhi6hGp6AESuWNIVnd
$ slappasswd -s secret
{SSHA}0Ulc8+ugMi3NbTtWnclOFW1LKCqRdsT8
W jaki sposób podczas uwierzytelniania slapd wie, jak losowo wygenerować skrót dla podanego hasła w taki sam sposób, aby pasował do hasła zdefiniowanego w pierwszej kolejności?
slappasswd
jest {SSHA} lub solona wersja SHA-1.{SSHA}
zawiera zarówno sól, jak i skrót.SSHA jest solonym SHA-1. Domyślnie ostatnie 4 bajty to sól. Dane wyjściowe slappasswd to
Aby więc sprawdzić, czy hasło w postaci zwykłego tekstu jest równe solonemu SHA, musisz:
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:
Dane wyjściowe mogą być:
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:
Dane wyjściowe to:
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
źródło