SSHA adalah SHA-1 asin. Secara default 4 Bytes terakhir adalah garam. Output dari slappasswd adalah
'{<Hash Method>}<base64 converted hash and salt>'
Jadi untuk menguji, apakah kata sandi teks biasa sama dengan SHA asin, Anda harus:
- lepaskan metode-specifier hash dengan misalnya sed.
- decode string base64
- ekstrak 4 byte terakhir, ini adalah garam
- menggabungkan garam ke kata sandi teks biasa
- hash itu
- membandingkan
String base64-decoded berisi hash dalam bentuk biner dan tidak dapat dicetak, jadi kita akan mengubahnya menjadi hex dengan od. 3 langkah pertama sedang dilakukan oleh kode berikut:
#!/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"
Outputnya bisa:
{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;▒
Jadi sekarang kita harus menggabungkan garam ke kata sandi teks biasa dan memotongnya, kali ini tanpa salting! Masalah yang saya miliki adalah pemahaman, bahwa garam dapat benar-benar karakter apa saja, termasuk karakter yang tidak dapat dicetak. Untuk menggabungkan karakter-karakter yang tidak dapat dicetak ini, kami akan menggunakan printf dan representasi heksadesimalnya:
slappasswd -h {SHA} -s $(printf 'password\xd3\x62\x3b\x87') | sed 's/{SHA}//' | base64 -d | od -A n -t x1
Outputnya adalah:
7c 3b b4 3e 02 83 9f 50 e2 f5 6d 47 30 83 69 3d 74 6a 43 d8
Yang sama dengan hash di atas. Sekarang kami telah memverifikasi, bahwa 'kata sandi' cocok dengan SHA asin.
Terima kasih dan bacaan lebih lanjut: http://cpansearch.perl.org/src/GSHANK/Crypt-SaltedHash-0.09/lib/Crypt/SaltedHash.pm
slappasswd
adalah {SSHA}, atau versi asin SHA-1.