SSHA - це солона SHA-1. За замовчуванням останні 4 байти - сіль. Вихід slappasswd дорівнює
'{<Hash Method>}<base64 converted hash and salt>'
Тож для того, щоб перевірити, чи рівний звичайний текстовий пароль дорівнює соленій SHA, вам потрібно:
- зніміть специфікатор методу хешу, наприклад, sed.
- декодувати рядок base64
- витягнути останні 4 байти, це сіль
- з'єднати сіль в звичайний текстовий пароль
- хеш
- порівняти
Рядок, декодований 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
slappasswd
{SSHA}, або солона версія SHA-1.