SSHA là một SHA-1 mặn. Theo mặc định, 4 byte cuối cùng là muối. Đầu ra của slappasswd là
'{<Hash Method>}<base64 converted hash and salt>'
Vì vậy, để kiểm tra, liệu mật khẩu văn bản đơn giản có bằng SHA đã được muối hay không, bạn cần phải:
- tước bộ xác định phương thức băm với ví dụ sed.
- giải mã chuỗi base64
- trích xuất 4 byte cuối cùng, đây là muối
- nối muối với mật khẩu văn bản đơn giản
- Đã trúng
- đối chiếu
Chuỗi được giải mã base64 chứa hàm băm ở dạng nhị phân và không thể được in, vì vậy chúng tôi sẽ chuyển đổi nó thành hex bằng od. 3 bước đầu tiên đang được thực hiện theo mã sau:
#!/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"
Đầu ra có thể là:
{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;▒
Vì vậy, bây giờ chúng ta phải nối muối với mật khẩu văn bản đơn giản và băm nó, lần này không có muối! Vấn đề tôi đã hiểu là muối thực sự có thể là bất kỳ ký tự nào, kể cả các ký tự không in được. Để ghép các ký tự không in được này, chúng tôi sẽ sử dụng printf và các biểu diễn thập lục phân của chúng:
slappasswd -h {SHA} -s $(printf 'password\xd3\x62\x3b\x87') | sed 's/{SHA}//' | base64 -d | od -A n -t x1
Đầu ra là:
7c 3b b4 3e 02 83 9f 50 e2 f5 6d 47 30 83 69 3d 74 6a 43 d8
Mà bằng với hàm băm ở trên. Bây giờ chúng tôi đã xác minh, 'mật khẩu' khớp với SHA đã được muối.
Cảm ơn và đọc thêm: http://cpansearch.perl.org/src/GSHANK/Crypt-SaltedHash-0.09/lib/Crypt/SaltedHash.pm
slappasswd
là {SSHA} hoặc phiên bản muối của SHA-1.