ฉันต้องเก็บเกลือด้วย bcrypt หรือไม่?


189

javadoc ของ bCryptมีรหัสนี้สำหรับวิธีการเข้ารหัสรหัสผ่าน:

String pw_hash = BCrypt.hashpw(plain_password, BCrypt.gensalt()); 

ในการตรวจสอบว่ารหัสผ่านแบบธรรมดานั้นตรงกับรหัสผ่านที่แฮชก่อนหน้านี้หรือไม่ให้ใช้วิธีการ checkpw:

if (BCrypt.checkpw(candidate_password, stored_hash))
    System.out.println("It matches");
else
    System.out.println("It does not match");

ตัวอย่างโค้ดเหล่านี้บอกฉันว่าเกลือที่สร้างขึ้นแบบสุ่มถูกโยนทิ้งไป เป็นกรณีนี้หรือเป็นเพียงข้อมูลโค้ดที่ทำให้เข้าใจผิด?

คำตอบ:


214

เกลือถูกรวมเข้าไปในแฮช (เข้ารหัสในรูปแบบ base64)

ตัวอย่างเช่นในรหัสผ่าน Unix แบบดั้งเดิมเกลือจะถูกจัดเก็บเป็นอักขระสองตัวแรกของรหัสผ่าน อักขระที่เหลือแสดงถึงค่าแฮช ฟังก์ชั่นตัวตรวจสอบรู้สิ่งนี้และดึงแฮชออกจากกันเพื่อดึงเกลือออกมา


59
เกลือถูกรวมอยู่ในรหัสผ่าน ดังนั้นคุณไม่จำเป็นต้องช่วยเกลือ
Swapnonil Mukherjee

2
ขอบคุณสำหรับสิ่งนั้น ฉันหวังว่าพวกเขาจะพูดว่าใน javadoc :) (ฉันได้ดูที่แหล่งข้อมูลและยืนยันแล้ว - แต่ฉันไม่รู้ว่าฉันกำลังมองหาอะไรมาก่อน)
RodeoClown

1
ขอบคุณ - ฉันพยายามคิดออกเช่นกัน! ตอนนี้ฉันสงสัยว่านี่เป็นความคิดที่ดีหรือไม่ มีข้อได้เปรียบ / เสียเปรียบในการเก็บเกลือไว้ในแฮชมากกว่าการจัดเก็บแยกต่างหากหรือไม่?
อดัม

8
@Adam - เนื่องจากเกลือถูกสร้างขึ้นแบบสุ่มหมายความว่าคุณไม่จำเป็นต้องมีวิธีการเชื่อมโยงสองสิ่งในฐานข้อมูลของคุณ
RodeoClown

ฉันลองดูซอร์สโค้ดและค้นพบว่าแม้ว่า JavaDoc สำหรับอาร์กิวเมนต์เกลือคือ "อาจสร้างโดยใช้ BCrypt.gensalt" ฉันพบว่าคุณต้องใช้วิธี genSalt () หรือคุณได้รับข้อยกเว้น = /
the_new_mr
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.