Wyjście Slappasswd jest losowe

10

Spodziewałem slappasswdsię 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?

Max
źródło

Odpowiedzi:

8

Wychodzę tutaj na kończynę, ale zakładam, że slappasswd używa solonego skrótu zamiast zwykłego skrótu. Oznacza to, że dodaje losowy prefiks do twojego hasła i zapisuje ten losowy prefiks jako część łańcucha, który widzisz na wyjściu slappasswd. Gdy wpiszesz hasło, dodaje do niego przedrostek, haszy wynik i porównuje go z ciągiem znaków wyjściowych slappasswd. Jeśli pasuje, jesteś w środku. Jeśli nie, hasło było nieprawidłowe :)

wzzrd
źródło
3
W rzeczy samej. W szczególności domyślną metodą skrótu slappasswdjest {SSHA} lub solona wersja SHA-1.
justarobert
Zgadzam się, ale moje pytanie pozostaje: jeśli sól skończy jako część skrótu, oznacza to, że nie możesz wyodrębnić soli z zakodowanego hasła. W związku z tym skąd slapd wie, jaką sól dodać podczas weryfikacji hasła? (musi dodać tę samą sól, aby hashowane hasła były takie same).
maks.
3
@ użytkownik: Część po {SSHA}zawiera zarówno sól, jak i skrót.
user1686
8

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:

  1. usuń specyfikator metody skrótu za pomocą np. sed.
  2. dekodować ciąg base64
  3. wyodrębnij 4 ostatnie bajty, to jest sól
  4. połącz sól z zwykłym hasłem tekstowym
  5. haszysz to
  6. 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

mxmlnkn
źródło