เกลือที่ไม่สุ่มสำหรับแฮชรหัสผ่าน


89

อัปเดต: เมื่อเร็ว ๆ นี้ฉันได้เรียนรู้จากคำถามนี้ว่าในการสนทนาทั้งหมดด้านล่างฉัน (และฉันแน่ใจว่าคนอื่น ๆ ก็ทำเช่นกัน) ค่อนข้างสับสน: สิ่งที่ฉันเรียกตารางสายรุ้งนั้นแท้จริงแล้วเรียกว่าตารางแฮช ตารางสายรุ้งเป็นสิ่งมีชีวิตที่ซับซ้อนกว่าและเป็นรูปแบบหนึ่งของ Hellman Hash Chains แม้ว่าฉันจะเชื่อว่าคำตอบนั้นยังคงเหมือนเดิม (เนื่องจากไม่ได้มีการเข้ารหัสลับ) การสนทนาบางส่วนอาจจะเบี้ยวเล็กน้อย
คำถาม: " อะไรคือตารางรุ้งและวิธีการที่พวกเขาใช้? "


โดยปกติฉันมักจะแนะนำให้ใช้ค่าสุ่มที่มีการเข้ารหัสที่แข็งแกร่งเป็นเกลือเสมอเพื่อใช้กับฟังก์ชันแฮช (เช่นรหัสผ่าน) เช่นเพื่อป้องกันการโจมตีของ Rainbow Table

แต่จริง ๆ แล้วมันจำเป็นสำหรับการสุ่มเกลือหรือไม่? ค่าที่ไม่ซ้ำกัน (ไม่ซ้ำกันต่อผู้ใช้เช่น userId) จะเพียงพอหรือไม่ในเรื่องนี้ ในความเป็นจริงมันจะป้องกันไม่ให้ใช้ Rainbow Table เดียวเพื่อถอดรหัสรหัสผ่านทั้งหมด (หรือส่วนใหญ่) ในระบบ ...
แต่การขาดเอนโทรปีทำให้ความแข็งแกร่งในการเข้ารหัสของฟังก์ชันแฮชลดลงหรือไม่?


หมายเหตุฉันไม่ได้ถามว่าทำไมต้องใช้เกลือวิธีการป้องกัน (ไม่จำเป็นต้องเป็น) การใช้แฮชคงที่เดียว (ไม่ต้อง) หรือฟังก์ชันแฮชประเภทใดที่จะใช้
เพียงแค่ว่าเกลือต้องการเอนโทรปีหรือไม่


ขอบคุณทุกคนสำหรับคำตอบจนถึงตอนนี้ แต่ฉันอยากจะเน้นในส่วนที่ฉันไม่ค่อยคุ้นเคย (นิดหน่อย) ผลกระทบส่วนใหญ่สำหรับการเข้ารหัส - ฉันจะขอบคุณมากที่สุดถ้าใครมีข้อมูลบางอย่างจาก PoV ทางคณิตศาสตร์การเข้ารหัสลับ
นอกจากนี้หากมีเวกเตอร์เพิ่มเติมที่ไม่ได้รับการพิจารณาก็เป็นข้อมูลที่ดีเช่นกัน (ดูที่ @Dave Sherohman ชี้ในหลายระบบ)
นอกเหนือจากนั้นหากคุณมีทฤษฎีแนวคิดหรือแนวทางปฏิบัติที่ดีที่สุดโปรดสำรองข้อมูลนี้ด้วยการพิสูจน์สถานการณ์การโจมตีหรือหลักฐานเชิงประจักษ์ หรือแม้กระทั่งการพิจารณาที่ถูกต้องสำหรับการแลกเปลี่ยนที่ยอมรับได้ ... ฉันคุ้นเคยกับแนวทางปฏิบัติที่ดีที่สุด (ตัวพิมพ์ใหญ่ B ทุน P) ในหัวข้อนี้ฉันต้องการพิสูจน์ว่าสิ่งนี้ให้คุณค่าอย่างไร


แก้ไข: คำตอบที่ดีจริงๆที่นี่ แต่ฉันคิดว่าอย่างที่ @Dave พูดมันลงมาที่ Rainbow Tables สำหรับชื่อผู้ใช้ทั่วไป ... และอาจมีชื่อสามัญน้อยกว่าด้วย อย่างไรก็ตามจะเกิดอะไรขึ้นหากชื่อผู้ใช้ของฉันไม่ซ้ำกันทั่วโลก? ไม่จำเป็นต้องซ้ำกันสำหรับระบบของฉัน แต่สำหรับผู้ใช้แต่ละคนเช่นที่อยู่อีเมล
จะไม่มีแรงจูงใจในการสร้าง RT สำหรับผู้ใช้รายเดียว (ตามที่ @Dave เน้นย้ำว่าเกลือจะไม่ถูกเก็บเป็นความลับ) และยังคงป้องกันไม่ให้เกิดการรวมกลุ่ม ปัญหาเดียวคือฉันอาจมีอีเมลและรหัสผ่านเดียวกันในไซต์อื่น - แต่เกลือจะไม่สามารถป้องกันได้อยู่ดี
ดังนั้นจึงกลับลงมาที่การเข้ารหัส - เอนโทรปีจำเป็นหรือไม่? (ความคิดในปัจจุบันของฉันไม่จำเป็นจากมุมมองของการเข้ารหัส แต่มาจากเหตุผลในทางปฏิบัติอื่น ๆ )


ฉันต้องบอกว่าฉันสับสนกับคำตอบมากมายด้านล่าง ประเด็นหลักของการใช้เกลือคือเพียงเพื่อป้องกันการโจมตีโต๊ะสายรุ้งดังนั้นสิ่งที่ไม่เหมือนใครสำหรับผู้ใช้ควรทำเพราะบังคับให้ผู้โจมตีสร้างตารางรุ้งสำหรับเกลือแต่ละอัน 2c ของฉัน
Goran

หากต้องการเกลือเช่น ไซต์คุณมักมีรหัสใน URL หากผู้โจมตีรู้ (และเราคิดว่าเขาทำ) เกลือรหัสผ่านคือรหัสผู้ใช้ + ชื่อผู้ใช้มันค่อนข้างง่ายที่จะแก้ไขการโจมตีเพื่อหลีกเลี่ยงค่าเกลือ
dmajkic

@dmajkic เกลือมีไว้เพื่อป้องกันการโจมตีของ RT และแยกรหัสผ่านเดียวกันสำหรับผู้ใช้ที่แตกต่างกัน นี่คือการให้แม้กระทั่งกับชื่อผู้ใช้
AviD

@AviD: นั่นคือเรื่องจริง แต่ถ้าฉันรู้แฮชสำหรับพาสของฉันและฉันรู้ว่าเกลือเป็นชื่อผู้ใช้ของฉันฉันก็สามารถสร้างค่าแฮชพาสสำหรับคำศัพท์ในพจนานุกรมใด ๆ และเปรียบเทียบกับแฮชของคนอื่นได้ นั่นคือเหตุผลที่เวลาดีกว่าชื่อผู้ใช้
dmajkic

1
เพิ่งพบบทความในเว็บไซต์ PHP Security Consortium ที่ในตัวอย่างใช้หมายเลขสุ่มที่แฮช md5 เป็นเกลือ phpsec.org/articles/2005/password-hashing.html
helloworlder

คำตอบ:


156

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

อย่างไรก็ตามการใช้ชื่อผู้ใช้หรือค่าที่ผู้ใช้ควบคุมเป็นเกลือจะลดความปลอดภัยข้ามระบบเนื่องจากผู้ใช้ที่มีชื่อผู้ใช้และรหัสผ่านเดียวกันในหลายระบบที่ใช้อัลกอริธึมการแฮชรหัสผ่านเดียวกันจะลงเอยด้วยการแฮชรหัสผ่านเดียวกัน แต่ละระบบนั้น ฉันไม่ถือว่านี่เป็นความรับผิดที่สำคัญเพราะฉันในฐานะผู้โจมตีจะลองใช้รหัสผ่านที่บัญชีเป้าหมายเป็นที่รู้กันว่าใช้ในระบบอื่นก่อนก่อนที่จะพยายามใช้วิธีอื่นใดในการบุกรุกบัญชี แฮชที่เหมือนกันจะบอกฉันล่วงหน้าเท่านั้นว่ารหัสผ่านที่ทราบจะใช้งานได้พวกเขาจะไม่ทำให้การโจมตีจริงง่ายขึ้น (อย่างไรก็ตามโปรดทราบว่าการเปรียบเทียบฐานข้อมูลบัญชีอย่างรวดเร็วจะให้รายการเป้าหมายที่มีลำดับความสำคัญสูงกว่าเนื่องจากจะบอกฉันว่าใครคือใครและใครไม่ได้ใช้รหัสผ่านซ้ำ)

อันตรายที่ยิ่งใหญ่กว่าจากแนวคิดนี้ก็คือชื่อผู้ใช้มักจะถูกนำกลับมาใช้ - ไซต์ใด ๆ ที่คุณต้องการเข้าชมจะมีบัญชีผู้ใช้ชื่อ "Dave" เป็นต้นและ "ผู้ดูแลระบบ" หรือ "root" ก็เป็นเรื่องธรรมดามากขึ้นซึ่งจะทำให้ การสร้างตารางสายรุ้งที่กำหนดเป้าหมายผู้ใช้ด้วยชื่อสามัญเหล่านั้นง่ายและมีประสิทธิภาพมากขึ้น

ข้อบกพร่องทั้งสองนี้สามารถแก้ไขได้อย่างมีประสิทธิภาพโดยการเพิ่มค่าเกลือที่สอง (ไม่ว่าจะคงที่และซ่อนอยู่หรือเปิดเผยเช่นเกลือมาตรฐาน) ลงในรหัสผ่านก่อนที่จะแฮช แต่ ณ จุดนั้นคุณอาจใช้เกลือเอนโทรปิกมาตรฐานก็ได้เช่นกัน ของการใช้งานชื่อผู้ใช้ลงไป

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

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

เหตุผลที่เอนโทรปีมีความสำคัญคือการหลีกเลี่ยงการรวมกลุ่มของค่าเกลือ หากเกลือขึ้นอยู่กับชื่อผู้ใช้และคุณทราบว่าระบบส่วนใหญ่จะมีบัญชีชื่อ "root" หรือ "admin" คุณสามารถสร้างตารางสายรุ้งสำหรับเกลือทั้งสองนี้และจะทำให้ระบบส่วนใหญ่แตก ในทางกลับกันถ้าใช้เกลือ 16 บิตแบบสุ่มและค่าสุ่มมีการแจกแจงแบบสม่ำเสมอคุณต้องมีตารางรุ้งสำหรับเกลือที่เป็นไปได้ทั้งหมด 2 ^ 16

ไม่ได้เกี่ยวกับการป้องกันไม่ให้ผู้โจมตีรู้ว่าเกลือของแต่ละบัญชีคืออะไร แต่เป็นการไม่ให้เป้าหมายที่ใหญ่และอ้วนเป็นเกลือเม็ดเดียวที่จะใช้กับเป้าหมายที่เป็นไปได้ในสัดส่วนที่มาก


เห็นด้วย ฉันให้ความสำคัญกับการใช้ชื่อผู้ใช้ซ้ำมากขึ้นเนื่องจากฉันคิดว่านั่นเป็นการโจมตีที่น่าจะประสบความสำเร็จมากที่สุดกับระบบสมมุติโดยใช้ชื่อผู้ใช้เป็นเกลือซึ่งจะล้มเหลวกับระบบที่ใช้เกลือแบบสุ่ม
Steve Jessop

ขอขอบคุณประเด็นของคุณเกี่ยวกับการรักษาความปลอดภัยข้ามระบบ นอกจากนี้ฉันเดาว่าในอนาคตไม่น่าจะเห็นตารางรุ้งเฉพาะผู้ใช้ ...
AviD

@AviD: คุณคิดอย่างนั้นเหรอ? นั่นเป็นเวกเตอร์การโจมตีที่เฉพาะเจาะจง
David Grant

2
ไม่ใช่เพื่อสร้างเกลือไม่ใช่ การโจมตีเดียวที่ได้รับผลกระทบจากเกลือคือการโจมตีโดยตรงกับรหัสผ่านที่แฮช การโจมตีไม่สามารถทำการโจมตีแบบนี้ได้เว้นแต่จะมีสำเนาฐานข้อมูลรหัสผ่านของคุณซึ่งจะมีเกลืออยู่ด้วย เนื่องจากผู้โจมตีจะมีเกลืออยู่ในความครอบครองอยู่แล้วพวกเขาต้องการเพียงเอนโทรปีที่เพียงพอเพื่อหลีกเลี่ยงการแฮชรหัสผ่านหลายรหัสด้วยเกลือเดียวกันซึ่ง RNG พื้นฐาน (P) ใด ๆ จะมีให้
Dave Sherohman

3
@ acidzombie24: การใช้เกลือคงที่เพียงครั้งเดียว (โดยปกติเรียกว่า "nonce" ในประสบการณ์ของฉัน) สำหรับรหัสผ่านทั้งหมดจะมีความปลอดภัยน้อยกว่าการใช้เกลือแบบสุ่มที่ไม่ซ้ำกันสำหรับแต่ละรหัสผ่านเนื่องจากยังช่วยให้ผู้โจมตีสามารถระบุได้เล็กน้อยว่าสองบัญชีหรือมากกว่านั้นใช้ร่วมกันหรือไม่ รหัสผ่านเดียวกัน ในทางกลับกัน nonce น่าจะถูกเก็บไว้ในรหัสของคุณมากกว่าในฐานข้อมูลดังนั้นผู้โจมตีที่มีเพียงฐานข้อมูลของคุณจะไม่สามารถเข้าถึงได้ ด้วยเหตุนี้ตัวเลือกที่ปลอดภัยที่สุดคือการใช้ทั้ง nonce ทั้งระบบ (เก็บไว้ในรหัส) และเกลือต่อรหัสผ่าน (เก็บไว้ในฐานข้อมูล)
Dave Sherohman

29

การใช้เกลือที่มีเอนโทรปีสูงเป็นสิ่งจำเป็นอย่างยิ่งในการจัดเก็บรหัสผ่านอย่างปลอดภัย

ใช้ชื่อผู้ใช้ของฉัน 'gs' และเพิ่มลงในรหัสผ่านของฉัน 'MyPassword' จะให้ gsMyPassword สิ่งนี้หักได้ง่ายโดยใช้ตารางรุ้งเพราะถ้าชื่อผู้ใช้มีเอนโทรปีไม่เพียงพออาจเป็นไปได้ว่าค่านี้ถูกเก็บไว้ในตารางรุ้งแล้วโดยเฉพาะอย่างยิ่งถ้าชื่อผู้ใช้สั้น

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

พวกเขาเคยมีเกลือ 12 บิต 12 บิตคือชุดค่าผสมที่แตกต่างกัน 4096 ที่ไม่ปลอดภัยเพียงพอเนื่องจากว่าข้อมูลมากสามารถเก็บได้ง่ายในปัจจุบัน เช่นเดียวกับชื่อผู้ใช้ที่ใช้บ่อยที่สุด 4096 มีแนวโน้มว่าผู้ใช้ของคุณไม่กี่คนจะเลือกชื่อผู้ใช้ที่เป็นของชื่อผู้ใช้ที่พบบ่อยที่สุด

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


อย่างไรก็ตาม +1 สำหรับจุดที่ดีคุณกำลังพูดถึงโต๊ะสายรุ้งขนาดใหญ่ที่อาจมีขนาดใหญ่ เพื่อให้ครอบคลุมค่าทั้งหมดของความยาว gsMyPassword (สมมติว่าเป็นตัวอักษรผสมตัวเลขคละกัน) ต้องใช้ 36 ^ 12 แถวในตาราง!
David Grant

จากการติดตามผล: โครงการตารางสายรุ้งแบบกระจายมีแฮชแตก 63,970 ครั้ง แต่ 36 ^ 12 คือ 4,738,381,338,321,616,896!
David Grant

ขอบคุณและนี่ก็สมเหตุสมผล - แต่อย่างที่คุณ PotatoHead ชี้ให้เห็นคุณยังคงขยายพื้นที่ของคุณเกินกว่าความเป็นไปได้ที่สมเหตุสมผลในการแคร็กด้วย RT นอกจากนี้สมมติว่าชื่อผู้ใช้ของฉันมีความยาวอย่างน้อย 6-8 ตัวเอนโทรปีให้ค่าที่จำเป็นเพิ่มเติมอะไร
AviD

@ Potato: คุณสมมติว่าตารางสีรุ้งที่มีตัวอักษรผสมตัวเลขและตัวอักษรที่เป็นไปได้ทั้งหมด ไม่จำเป็นต้องเป็นเช่นนั้นตารางสายรุ้งที่มีประสิทธิภาพจะมีแฮชสำหรับรหัสผ่าน / แฮชทั่วไป เกลือมีไว้เพื่อป้องกันการโจมตีจากพจนานุกรมหรือรวมโต๊ะสายรุ้ง / พจนานุกรม
Guillaume

3
การใช้ชื่อผู้ใช้เป็นเกลือเป็นความคิดที่ไม่ดีสำหรับระบบที่มีบัญชีที่มีสิทธิ์สูงที่คาดเดาได้: "ผู้ดูแลระบบ" บน Windows, "root" บน * nix, "sa" ใน MSSQL เป็นต้น
ไม่มีใคร

8

เป็นเรื่องจริงที่ชื่อผู้ใช้เพียงอย่างเดียวอาจเป็นปัญหาได้เนื่องจากผู้คนอาจแชร์ชื่อผู้ใช้ระหว่างเว็บไซต์ต่างๆ แต่ควรจะไม่เป็นปัญหาหากผู้ใช้มีชื่อที่แตกต่างกันในแต่ละเว็บไซต์ แล้วทำไมไม่เพียงแค่ทำให้มันไม่ซ้ำกันในแต่ละเว็บไซต์ แฮชรหัสผ่านแบบนี้

แฮช ("www.yourpage.com /" + ชื่อผู้ใช้ + "/" + รหัสผ่าน)

สิ่งนี้ควรแก้ปัญหาได้ ฉันไม่ใช่ผู้เชี่ยวชาญด้านการเข้ารหัสลับ แต่ฉันสงสัยว่าการที่เราไม่ใช้เอนโทรปีสูงจะทำให้แฮชอ่อนแอลง


ฉันเชื่อว่าคุณพูดถูกว่าเพียงพอแล้ว อย่างไรก็ตามเนื่องจากแฮชนั้นเป็นฟิลด์ทางคณิตศาสตร์ที่ซับซ้อนและเป็นไปได้ดีมากที่เกลือเอนโทรปีต่ำจะทำให้แฮชเดาได้ง่ายขึ้นในอนาคต (โดยเฉพาะอย่างยิ่งเมื่อแฮชเสีย) ฉันจะไม่เดิมพันกับความปลอดภัยเมื่อพิสูจน์แล้ว โซลูชันที่ปลอดภัยกว่านั้นไม่แพงกว่ามาก
Georg Schölly

7

ฉันชอบใช้ทั้งสอง: เกลือที่มีเอนโทรปีสูงแบบสุ่มต่อเรกคอร์ดบวกกับ ID เฉพาะของเร็กคอร์ด

แม้ว่าสิ่งนี้จะไม่ได้เพิ่มความปลอดภัยมากนักจากการโจมตีด้วยพจนานุกรม ฯลฯ แต่ก็เป็นการลบกรณีที่มีคนคัดลอกเกลือของพวกเขาและแฮชไปยังบันทึกอื่นโดยตั้งใจที่จะเปลี่ยนรหัสผ่านด้วยตัวเอง

(เป็นที่ยอมรับว่ามันยากที่จะนึกถึงสถานการณ์ที่เป็นเช่นนี้ แต่ฉันไม่เห็นอันตรายใด ๆ ในเข็มขัดและเครื่องมือจัดฟันในเรื่องความปลอดภัย)


ฉันชอบแนวคิดในการผูกรหัสผ่านกับผู้ใช้ แต่หากผู้โจมตีสามารถเปลี่ยนรหัสผ่านได้เขาก็สามารถเปลี่ยนรหัสได้เช่นกัน
Georg Schölly

ขึ้นอยู่กับว่า ID คืออะไร: ฉันใช้คีย์หลักของตารางซึ่งคุณไม่สามารถเปลี่ยนแปลงได้ตามต้องการ TBH ถ้าแฮ็กเกอร์เขียนไปยังฐานข้อมูลของคุณคุณก็ประสบปัญหาใหญ่อยู่แล้ว ...
teedyay

3
ไม่ฉันชอบมัน ผู้โจมตีมักเป็น "คนวงใน" ฉันสามารถฝันถึงสถานการณ์ที่สิ่งที่เขาต้องการไม่ได้อยู่ในฐานข้อมูล แต่ถ้าเขาสามารถเขียนทับข้อมูลประจำตัวในฐานข้อมูลได้เขาก็สามารถตรวจสอบตัวเองเพื่อทำสิ่งที่เขาต้องการได้
erickson

1
จุดดี. เราพบว่าการเพิ่มผู้ใช้รายแรกไปยังฐานข้อมูลใหม่ทำได้ยากขึ้นเรื่อย ๆ : เราได้สร้างแอปพลิเคชันของเราอย่างมีประสิทธิภาพเพื่อให้ปลอดภัยเราแทบจะไม่สามารถแฮ็คได้ด้วยตัวเอง [นอกจากนี้ให้ใช้ Salt เฉพาะแอปพลิเคชันเพื่อให้คุณไม่สามารถคัดลอกข้อมูลรับรองจากฐานข้อมูลหนึ่งไปยังอีกฐานข้อมูลได้]
teedyay

ในที่สุดฉันก็พบว่ามีคนพูดแบบนี้: เพิ่มบางสิ่งที่ผู้ใช้เฉพาะเจาะจงลงในเกลือ เพื่อหลีกเลี่ยงไม่ให้ผู้บุกรุกคัดลอกข้อมูลรับรองบางส่วนไปยังผู้ใช้รายอื่นและยังป้องกันไม่ให้แฮ็กเกอร์เดารหัสผ่านใด ๆ หากเขาสามารถเข้าถึงกัญชาและช่องเกลือของคุณในตารางได้ สิ่งหนึ่งที่ฉันชอบทำมากกว่านั้นคือไม่ใช้การวนซ้ำในการแฮช อย่าไปใช้เงิน 10k หรือ 20k แต่เป็นอย่างเช่นปี 19835
Andrew

3

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

การใช้เกลือที่เป็นเอกลักษณ์ช่วยเพิ่มความยากในการโจมตีพจนานุกรมจำนวนมาก

การมีค่าเกลือที่แข็งแกร่งในการเข้ารหัสลับเฉพาะจะเหมาะอย่างยิ่ง


2
จุดรวมของตารางสีรุ้งคือค่าที่สร้างไว้ล่วงหน้าและถ้าคุณสร้างตารางสำหรับค่า (เช่นรหัสผ่าน) บวกค่าคงที่ที่กำหนดนั่นคือตารางที่แตกต่างกันโดยสิ้นเชิงและคุณก็อาจจะ ลองใช้ผลลัพธ์แฮชโดยตรง :)
David Grant

1
แฮชคงไม่มีค่าอะไรเลย รหัสผ่านทั้งหมดสามารถแตกได้โดยใช้ตารางรุ้งเดียว จุดประสงค์ของเกลือคือไม่สามารถสร้างโต๊ะสายรุ้งได้
Georg Schölly

1
@gs - ฉันไม่เห็นว่าทำไมคุณไม่สามารถสร้างตารางสายรุ้งที่ "รวม" เอฟเฟกต์ของเกลือคงที่ได้ พื้นที่โจมตี (รหัสผ่าน) จะไม่มีการเปลี่ยนแปลงดังนั้นตารางจึงไม่จำเป็นต้องเติบโตเพียงแค่คำนวณใหม่
HUAGHAGUAH

@ Potato - ขึ้นอยู่กับการแลกเปลี่ยน หากการเข้าสู่ระบบ 20k ของ บริษัท ของคุณถูกแฮชด้วยเกลือคงที่เท่ากันการคำนวณตารางสายรุ้งสดอาจถูกกว่าการโจมตีด้วยพจนานุกรมทั้งหมดทีละรายการ ดังนั้นการเน้น "BULK" ของฉัน
HUAGHAGUAH

3

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

การใช้เกลือที่มีเอนโทรปีมากขึ้นไม่ได้ช่วยอะไรมากนักเนื่องจากผู้โจมตีในกรณีนี้ถือว่ามีฐานข้อมูลอยู่แล้ว เนื่องจากคุณต้องสามารถสร้างแฮชขึ้นมาใหม่ได้คุณจึงต้องรู้อยู่แล้วว่าเกลือคืออะไร ดังนั้นคุณต้องเก็บเกลือหรือค่าที่ประกอบเป็นเกลือไว้ในไฟล์ของคุณอยู่ดี ในระบบเช่น Linux วิธีการรับเกลือเป็นที่รู้จักดังนั้นจึงไม่มีประโยชน์ในการมีเกลือลับ คุณต้องสันนิษฐานว่าผู้โจมตีที่มีค่าแฮชของคุณอาจจะรู้ค่าเกลือของคุณเช่นกัน


3
"จุดของเกลือคือคุณไม่สามารถใช้ตารางรุ้งมาตรฐานเพื่อแก้รหัสผ่านทั้งหมดในฐานข้อมูล" ฉันไม่เห็นด้วย. ประเด็นคือคุณไม่สามารถใช้ตารางสายรุ้งมาตรฐานเพื่อแก้รหัสผ่านใด ๆ ถ้าเกลือเป็นชื่อผู้ใช้ตารางสีรุ้งสำหรับ "root" อาจแตก pw ของรูทได้
Steve Jessop

นั่นอาจเกี่ยวกับกฎเดียวที่สำคัญจริงๆ โดยทั่วไปคุณต้องการให้รหัสผ่านเป็นสิ่งที่ไม่เหมือนใครในระบบของคุณ แต่ไม่สำคัญว่าจะเป็นอย่างไร มันยังคงเป็นอะไรที่เรียบง่าย คุณไม่จำเป็นต้องมีเอนโทรปีมากนัก
Kibbee

นี่เป็นความคิดของฉันเหมือนกัน - แต่ฉันติดอยู่ที่ "อาจจะโอเค" ฉันยังไม่เห็นว่าทฤษฎีนี้ได้รับการพิสูจน์หรืออย่างน้อยก็ตรวจสอบแล้วว่าไม่มีผลกระทบจากการเข้ารหัส
AviD

@onebyone: ถ้าเกลือประกอบด้วยชื่อผู้ใช้ + ค่าคงที่ในท้องถิ่น (ฉันมักจะใช้ ':') นั่นก็ยังคงทำลาย RT ที่เป็นมาตรฐานเว้นแต่จะมีหลายตัวที่รวมถึงชื่อผู้ใช้ทั่วไปและค่าเกลือคงที่ทั่วไป ฉันค่อนข้างสงสัยว่าไม่ใช่อย่างนั้น
nsayer

พร้อมกับ nsayer. คุณสามารถใช้สตริงคงที่ทั้งระบบซึ่งจะไม่มี RT ที่สร้างไว้ล่วงหน้าสำหรับเช่น # (D83d8 พร้อมกับชื่อผู้ใช้เป็นเกลือและนั่นจะป้องกันการโจมตีตารางสายรุ้งได้อย่างรวดเร็ว
Kibbee

3

ความแรงของฟังก์ชันแฮชไม่ได้ถูกกำหนดโดยอินพุต!

การใช้เกลือที่ผู้โจมตีรู้จักทำให้การสร้างตารางสายรุ้ง (โดยเฉพาะอย่างยิ่งสำหรับชื่อผู้ใช้ที่เข้ารหัสยากเช่นรูท ) น่าสนใจยิ่งขึ้น แต่ก็ไม่ได้ทำให้แฮชลดลงกัญชาการใช้เกลือที่ผู้โจมตีไม่รู้จักจะทำให้ระบบโจมตีได้ยากขึ้น

การเชื่อมต่อชื่อผู้ใช้และรหัสผ่านอาจยังคงเป็นรายการสำหรับตารางสายรุ้งอัจฉริยะดังนั้นการใช้ชุดอักขระสุ่มหลอกแบบสุ่มซึ่งเก็บไว้ด้วยรหัสผ่านที่แฮชน่าจะเป็นความคิดที่ดีกว่า ตามภาพประกอบหากฉันมีชื่อผู้ใช้ "มันฝรั่ง" และรหัสผ่าน "เบียร์" อินพุตที่เชื่อมต่อกันสำหรับแฮชของคุณคือ "potatobeer" ซึ่งเป็นรายการที่สมเหตุสมผลสำหรับตารางสายรุ้ง

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

อย่างไรก็ตามฉันจะบอกว่าอัลกอริทึมการย่อยที่คุณเลือกมีความสำคัญมากกว่า การใช้ SHA-512 จะพิสูจน์ได้ว่าสร้างความเจ็บปวดให้กับคนที่สร้างตารางสายรุ้งมากกว่า MD5


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

@Martin: สิ่งเดียวที่คุณควรจะสามารถอนุมานจากค่าแฮชได้ว่าคุณมีคู่หรือไม่! การใส่ "roota" หรือ "rootb" (โดยที่ "a" และ "b" แทนรหัสผ่าน) ลงในฟังก์ชันแฮชจะให้เอาต์พุตที่แตกต่างกันอย่างสิ้นเชิง
David Grant

ยาดมเป็นที่รู้จักของผู้โจมตีโดยใช้โต๊ะสายรุ้ง
Georg Schölly

เซิร์ฟเวอร์ต้องทราบเกลือที่ไม่ได้เข้ารหัส (เพื่อตรวจสอบรหัสผ่านกับแฮช) ดังนั้นจึงสามารถยอมรับได้ว่าผู้โจมตีสามารถเข้าถึงเกลือหรือสามารถรับมันได้อย่างง่ายดาย
Georg Schölly

ถูกต้องนั่นคือสิ่งที่กำหนด - เพื่อให้เฉพาะเจาะจงมากขึ้นฉันหมายถึงความแข็งแกร่งของระบบเข้ารหัสโดยรวม (หรือ -subsystem, แฮช wrt)
AviD

1

เกลือควรมีเอนโทรปีให้มากที่สุดเพื่อให้แน่ใจว่าควรแฮชค่าอินพุตที่กำหนดหลาย ๆ ครั้งค่าแฮชที่ได้จะใกล้เคียงที่สุดเท่าที่จะทำได้ซึ่งแตกต่างกันเสมอ

การใช้ค่าเกลือที่เปลี่ยนแปลงตลอดเวลาโดยมีเอนโทรปีมากที่สุดในเกลือจะช่วยให้มั่นใจได้ว่าโอกาสในการแฮช (เช่นรหัสผ่าน + เกลือ) จะสร้างค่าแฮชที่แตกต่างกันอย่างสิ้นเชิง

ยิ่งมีเอนโทรปีในเกลือน้อยเท่าไหร่โอกาสที่คุณจะสร้างค่าเกลือเท่ากันก็จะยิ่งมีโอกาสมากขึ้นในการสร้างค่าแฮชที่เท่ากัน

เป็นลักษณะของค่าแฮชที่เป็น "ค่าคงที่" เมื่อทราบข้อมูลเข้าและ "ค่าคงที่" ที่ทำให้การโจมตีด้วยพจนานุกรมหรือตารางสายรุ้งมีประสิทธิภาพ โดยการเปลี่ยนค่าแฮชที่ได้ให้มากที่สุดเท่าที่จะเป็นไปได้ (โดยใช้ค่าเกลือของเอนโทรปีที่สูง) ทำให้มั่นใจได้ว่าการแฮชอินพุตเดียวกัน + สุ่ม - เกลือจะให้ผลลัพธ์ค่าแฮชที่แตกต่างกันจำนวนมากดังนั้นการเอาชนะ (หรืออย่างน้อยก็ลดประสิทธิภาพของ) ตารางรุ้ง การโจมตี


อีกครั้งฉันไม่ได้หมายถึงการใช้เกลือคงที่เดียว - แทนที่จะเป็นค่าที่ไม่สุ่ม แต่เป็นค่าเฉพาะของผู้ใช้ เช่น userId.
AviD

ประเด็นทั้งหมดคือค่าเกลือของคุณไม่ควรคงที่ ทุกสิ่งที่คุณแฮชไม่ว่าค่า "อินพุต" เดียวกันหรือไม่ควรมีเกลือที่แตกต่างกัน Dave Sherohman อธิบายถึงข้อเสียของการใช้แม้แต่ค่าที่ไม่ซ้ำกันของผู้ใช้ซึ่งโดยพื้นฐานแล้วจะยังคงเหมือนเดิมในการคำนวณแฮชแต่ละครั้ง
CraigTP

-1

เอนโทรปีคือจุดของค่าเกลือ

หากมี "คณิตศาสตร์" ที่เรียบง่ายและทำซ้ำได้อยู่เบื้องหลังเกลือก็เท่ากับว่าไม่มีเกลืออยู่ แค่เพิ่มมูลค่าเวลาก็น่าจะดี


ฉันไม่เข้าใจความคิดเห็นนี้ คุณพูดว่า "ใช้เอนโทรปี" แล้ว: "ใช้เวลา" ??
Martin Carpenter

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

"เอนโทรปิกเพียงพอ" เป็นอัตนัย มันเป็นมาตรฐานของคุณ การกำหนดค่าตรงเวลาอาจไม่เพียงพอ
Martin Carpenter

ไม่มีสิ่งที่เรียกว่า "การสุ่มจริงสัมบูรณ์" อยู่ที่เราว่าเมื่อไหร่ "ดีพอ" หากคุณคิดว่าในกรณีนี้เวลาไม่ดีพอให้ใช้อย่างอื่น stackoverflow.com/questions/84556/…
dmajkic

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