SSHA เป็น SHA-1 ที่เค็ม โดยค่าเริ่มต้น 4 ไบต์สุดท้ายคือเกลือ ผลลัพธ์ของ slappasswd คือ
'{<Hash Method>}<base64 converted hash and salt>'
ดังนั้นในการทดสอบว่ารหัสผ่านแบบข้อความล้วนมีค่าเท่ากับ SHA ที่มีการใส่เกลือคุณต้อง:
- ถอด hash method-specifier ด้วยเช่น sed
- ถอดรหัสสตริง base64
- แยก 4 ไบต์สุดท้ายนี่คือเกลือ
- เชื่อมเกลือเข้ากับรหัสผ่านข้อความธรรมดา
- แฮชมัน
- เปรียบเทียบ
สตริง base64-decoded มีแฮชในรูปแบบไบนารีและไม่สามารถพิมพ์ได้ดังนั้นเราจะแปลงเป็น hex ด้วย 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