ความยาวที่เหมาะสมที่สุดสำหรับเกลือรหัสผ่านผู้ใช้คืออะไร? [ปิด]


129

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


10
ฉันไม่มีคำแนะนำเกี่ยวกับความยาวของเกลือ แต่คำตอบที่ปรากฏที่นี่มีข้อมูลที่ไม่ดีมากมาย เกลือของคุณควร: - สุ่ม - เป็นความลับ (ไม่ใช่ค่าเดียวที่เก็บไว้ในอิมเมจโปรแกรมหรือไฟล์กำหนดค่าของคุณ) เกลือไม่ใช่ความลับในการเข้ารหัสดังนั้นการเก็บไว้ในโต๊ะของคุณจึงไม่มีปัญหา จุดประสงค์เดียวของเกลือคือเพื่อให้แน่ใจว่าเมื่อมีการแฮชอินสแตนซ์ของรายการเดียวกัน (หรือเข้ารหัส) ที่แตกต่างกันคุณจะได้ผลลัพธ์ที่แตกต่างกัน
Michael Burr

2
สำหรับผู้ที่ไม่ทราบว่าเกลือคืออะไร: <a href=" en.wikipedia.org/wiki/Salt_(cryptography)"> Salt (การเข้ารหัส) </a> ใน Wikipedia
David Koelle

1
หรือว่ามีอัตราส่วนที่เหมาะสมที่สุดสำหรับความยาวของเกลือต่อความยาวของแฮชเอาท์พุต? เกลือ 8 ไบต์อาจเพียงพอสำหรับ HMAC-SHA-256 แต่อาจไม่ถึง HMAC-SHA-512
Crend King

1
เกลือสุ่มแบบเข้ารหัสที่มีขนาดเท่ากับเอาต์พุตของฟังก์ชันแฮชหมายความว่าการโจมตีแบบ "ลองใช้เกลือที่เป็นไปได้ทั้งหมด" (บวกพจนานุกรมรหัสผ่าน) ต้องใช้ความพยายามมากพอ ๆ กับการโจมตีแบบ "ลองใช้ผลลัพธ์แฮชที่เป็นไปได้ทั้งหมด" ซึ่งเป็นกำลังเดรัจฉานมาตรฐาน . เกลือที่สั้นกว่าหมายความว่าคุณสามารถมีพจนานุกรมเกลือและพจนานุกรมรหัสผ่านเพื่อเป็นการโจมตีด้วยกำลังดุร้าย
Richard Gadsden

-1 เป็นที่ยอมรับไม่ (แม้จะพยายาม) ตอบคำถาม
user359996

คำตอบ:


71

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

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

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

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


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

7
หมายเหตุเกี่ยวกับย่อหน้าสุดท้ายของคุณหากคุณใช้เกลือทั่วทั้งไซต์ควรเป็นแบบนั้น: ทั้งไซต์ ไม่ใช่ทั้งแอปพลิเคชันกล่าวคือแต่ละอินสแตนซ์ใหม่ที่คุณติดตั้งแอปพลิเคชันของคุณควรสร้างเกลือใหม่ทั่วทั้งไซต์ ตัวอย่างเช่นหาก Windows ใช้เกลือเดียวกันในทุกฐานข้อมูลการรับรองความถูกต้องของ Windows การสร้างตารางสายรุ้งสำหรับเกลือนั้นจะคุ้มค่า แต่ถ้าการติดตั้ง Windows ทุกครั้งสร้างเกลือใหม่ก็จะไม่เกิดขึ้น
Richard Gadsden

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

3
หมายเหตุด่วน: หากใช้ชื่อผู้ใช้เป็นเกลืออาจเป็นปัญหาได้หากชื่อผู้ใช้เปลี่ยนไป ในทางปฏิบัติ (แม้ว่าจะมีการระบุไว้ในเอกสารการออกแบบของลูกค้าก็ตาม) ฉันพบว่าผู้ใช้มักต้องการเปลี่ยนชื่อผู้ใช้
SilentSteel

6
@ NateC-K แนวคิดเกี่ยวกับเกลือต่อไซต์ที่คุณกำลังพูดถึงเรียกว่าพริกไทย
Pacerier

35

มาตรฐานที่เป็นที่ยอมรับในปัจจุบันสำหรับการแฮชรหัสผ่านจะสร้างเกลือยาว 16 อักขระใหม่สำหรับทุกรหัสผ่านและจัดเก็บเกลือด้วยแฮชรหัสผ่าน

แน่นอนว่าควรใช้ความระมัดระวังในการเข้ารหัสที่เหมาะสมในการสร้างเกลือแบบสุ่ม


6
ตัวละครมีความหมายไม่ดีเล็กน้อย คุณควรจะพูดว่าไบต์
CodesInChaos

10
@CodesInChaos ฉันเชื่อว่าคุณหมายถึงoctet ;-)
user2864740

1
Hi! ดูเหมือนว่าบทความวิกิพีเดียจะเปลี่ยนไป - บางทีคุณควรอ้างถึงen.wikipedia.org/wiki/PBKDF2หรืออะไร?
Boris Treukhov


25

แก้ไข: ด้านล่างของฉันคำตอบที่ตอบคำถามตามที่ถาม แต่ "ของจริง" คำตอบคือ: เพียงแค่ใช้bcrypt , ScryptหรือArgon2 หากคุณถามคำถามเช่นนี้แสดงว่าคุณกำลังใช้เครื่องมือในระดับที่ต่ำเกินไป

ตามจริงแล้วไม่มีเหตุผลที่ป้องกันได้ที่จะไม่ให้เกลือมีความยาวเท่ากันกับรหัสผ่านที่แฮช หากคุณใช้ SHA-256 แสดงว่าคุณมีแฮช 256 บิต ไม่มีเหตุผลที่จะไม่ใช้เกลือ 256 บิต

มากกว่า 256 บิตจะไม่ทำให้คุณได้รับการปรับปรุงด้านความปลอดภัยในทางคณิตศาสตร์ แต่การใช้เกลือที่สั้นกว่านั้นอาจจบลงด้วยสถานการณ์ที่โต๊ะสีรุ้งสามารถจับกับความยาวเกลือของคุณได้โดยเฉพาะอย่างยิ่งกับเกลือที่สั้นกว่า


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

14
ยาดมป้องกันโต๊ะสายรุ้ง เกลือ 512 บิตพร้อมแฮช 256 บิตจะยังคงส่งผลให้เอนโทรปี 256 บิตในรหัสผ่านสุดท้ายเท่านั้น
Stephen Touset

8
การแฮชช้าเป็นคุณสมบัติไม่ใช่ข้อบกพร่อง
outis

7
หากคุณมีแฮช 3 บิตเกลือ 9999 บิตของคุณจะยังแฮชเอนโทรปีได้เพียง 3 บิตเท่านั้น ตารางรุ้งจะต้องหาเกลือสามตัวสำหรับแต่ละรหัสผ่านซึ่งส่งผลให้ได้ผลลัพธ์ที่แตกต่างกันซึ่งเป็นปัจจัยคูณที่คงที่และถูกทิ้งจาก big-O
Stephen Touset

2
.................................................. .................................... ระบบเฉพาะ. วัตถุประสงค์ของเกลือคือการหยุดการโจมตี precomputation เพื่อให้แฮชไม่สามารถค้นหาและย้อนกลับไปในทันทีธรรมดา ด้วยเกลือ 9999 บิตรหัสผ่านของคุณจะยังคงเป็นความลับในขณะที่เกลือ 3 บิตตอนนี้คนทั้งโลกรู้จักรหัสผ่านของคุณแล้ว (และพวกเขาสามารถใช้เพื่อเข้าสู่ระบบบัญชีอื่น ๆ ของคุณได้เนื่องจากหลายคนมักใช้รหัสผ่านซ้ำ) ฉันคิดว่ามันน่าขบขันที่คน 5 คนที่นี่ได้เพิ่มคะแนนความคิดเห็นของคุณเนื่องจากมีคำว่า "เอนโทรปี" อยู่ในนั้น
Pacerier

7

วิกิพีเดีย :

วิธี SHA2-crypt และ bcrypt ที่ใช้ใน Linux, BSD Unixes และ Solaris มีเกลือ 128 บิต ค่าเกลือที่มากขึ้นเหล่านี้ทำให้การโจมตีล่วงหน้าสำหรับความยาวของรหัสผ่านเกือบทุกรูปแบบไม่สามารถทำได้กับระบบเหล่านี้ในอนาคตอันใกล้

เกลือ 128 บิต (16 ไบต์) ก็เพียงพอแล้ว คุณสามารถแสดงเป็นลำดับของ128 / 4 = 32เลขฐานสิบหก


สำหรับฉันแล้วดูเหมือนว่าตัวอย่างของสิ่งที่ระบบรักษาความปลอดภัยอื่น ๆ ใช้เป็นตัวอย่างที่ดีว่าแนวทางปฏิบัติที่ดีที่สุดคืออะไร
cjbarth

1
@ mklement0 ขอบคุณฉันได้อัปเดตคำตอบแล้ว
Andrii Nemchenko

2

คำตอบหนึ่งอาจใช้เป็นขนาดของเกลือของค่าที่แฮชที่คุณจะใช้ในแง่ของความปลอดภัย

เช่นหากคุณจะใช้ SHA-512 ให้ใช้เกลือ 256 บิตเนื่องจากความปลอดภัยที่ SHA-512 มีให้คือ 256 บิต

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