Вихід Slappasswd рандомізований


10

Я розраховував slappasswdстворити фіксований хеш, але виявляється, що вихід є рандомізованим, оскільки я ніколи не отримую однаковий вихід для одного і того ж пароля введення:

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

Під час автентифікації, як slapd знає, як рандомізувати хеш для вказаного пароля таким же чином, щоб він міг відповідати паролю, визначеному в першу чергу?

Відповіді:


8

Тут виходить на кінцівку, але я припускаю, що slappasswd використовує солоний хеш замість простого хешу. Це означає, що він додає до вашого пароля випадковий префікс і зберігає цей випадковий префікс як частину рядка, який ви бачите у висновку slappasswd. Коли ви вводите свій пароль, він додає до нього префікс, хеширує результат і порівнює його з рядком у slappasswd-виході. Якщо він відповідає, ви знаходитесь. Якщо цього немає, ви помилилися паролем :)


3
Справді. Зокрема, за замовчуванням хеш-метод для slappasswd{SSHA}, або солона версія SHA-1.
justarobert

Я погоджуюся, але моє питання залишається: якщо сіль потрапить до складу хешу, це означає, що ви не можете витягнути сіль із хешованого пароля. Відповідно, як slapd знає, яку сіль додати під час перевірки пароля? (вона повинна додати ту саму сіль, щоб паролі хешировані були однаковими).
Макс

3
@user: Частина після {SSHA}містить як сіль, так і хеш.
користувач1686

8

SSHA - це солона SHA-1. За замовчуванням останні 4 байти - сіль. Вихід slappasswd дорівнює

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

Тож для того, щоб перевірити, чи рівний звичайний текстовий пароль дорівнює соленій SHA, вам потрібно:

  1. зніміть специфікатор методу хешу, наприклад, sed.
  2. декодувати рядок base64
  3. витягнути останні 4 байти, це сіль
  4. з'єднати сіль в звичайний текстовий пароль
  5. хеш
  6. порівняти

Рядок, декодований base64, містить хеш у двійковій формі і не може бути надрукований, тому ми перетворимо його в шістнадцятковий з od. Перші 3 кроки виконуються за допомогою наступного коду:

#!/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"

Вихід може бути:

{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;▒

Тож тепер ми маємо приєднати сіль до простого текстового пароля та хеширувати його, на цей раз без засолювання! Проблема, яку я мав, розуміла, що сіллю справді може бути будь-який персонаж, включаючи символи, що не друкуються. Для об'єднання цих недрукувальних символів ми будемо використовувати printf та їх шістнадцяткові зображення:

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

Вихід:

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

Який дорівнює хешу вище. Тепер ми перевірили, що 'пароль' відповідає соленій SHA.

Дякуємо та читаємо далі: http://cpansearch.perl.org/src/GSHANK/Crypt-SaltedHash-0.09/lib/Crypt/SaltedHash.pm

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.