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}มีทั้งเกลือและแฮช
user1686

8

SSHA เป็น SHA-1 ที่เค็ม โดยค่าเริ่มต้น 4 ไบต์สุดท้ายคือเกลือ ผลลัพธ์ของ slappasswd คือ

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

ดังนั้นในการทดสอบว่ารหัสผ่านแบบข้อความล้วนมีค่าเท่ากับ SHA ที่มีการใส่เกลือคุณต้อง:

  1. ถอด hash method-specifier ด้วยเช่น sed
  2. ถอดรหัสสตริง base64
  3. แยก 4 ไบต์สุดท้ายนี่คือเกลือ
  4. เชื่อมเกลือเข้ากับรหัสผ่านข้อความธรรมดา
  5. แฮชมัน
  6. เปรียบเทียบ

สตริง 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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.