รหัสผ่านเกลือช่วยต่อต้านการโจมตีบนโต๊ะสีรุ้งได้อย่างไร?


220

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

ฉันเคยเห็นแบบฝึกหัดมากมายที่แนะนำว่าเกลือถูกใช้ดังนี้:

$hash =  md5($salt.$password)

เหตุผลที่แฮชตอนนี้แมปไม่ใช่รหัสผ่านดั้งเดิม แต่เป็นการรวมกันของรหัสผ่านและเกลือ แต่พูด$salt=fooและและ$password=bar $hash=3858f62230ac3c915f300c664312c63fตอนนี้ใครบางคนที่มีตารางสายรุ้งสามารถย้อนแฮชและสร้างอินพุต "foobar" จากนั้นพวกเขาสามารถลองใช้รหัสผ่านทั้งหมด (f, fo, foo, ... oobar, obar, bar, ar, ar) อาจใช้เวลาสองสามมิลลิวินาทีในการรับรหัสผ่าน แต่ไม่มากนัก

การใช้งานอื่นที่ฉันเห็นอยู่ในระบบ Linux ของฉัน ใน / etc / shadow รหัสผ่านที่ถูกแฮชจะถูกเก็บไว้พร้อมกับเกลือ ยกตัวอย่างเช่นเกลือของ "foo" และรหัสผ่านของ "บาร์" $1$foo$te5SBM.7C25fFDu6bIRbX1จะสับไปนี้: หากแฮ็กเกอร์สามารถใช้มือของเขากับไฟล์นี้ได้ฉันไม่เห็นว่าจุดประสงค์ของเกลือte5SBM.7C25fFDu6bIRbXคืออะไร

ขอบคุณสำหรับทุก ๆ แสงที่สามารถหลั่งออกมาได้

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



และดูเพิ่มเติมได้ที่: stackoverflow.com/questions/1645161/…
2552

อัปเดตที่นี่ด้วย - การใช้ md5 hashing ไม่ใช่วิธีปฏิบัติที่ดีที่สุดอีกต่อไป stackoverflow.com/questions/12724935/salt-and-passwords
StuartLC

ขอบคุณสำหรับการแก้ไข ฉันมีข้อสงสัยเหมือนกันซึ่งตอนนี้ชัดเจน ดังนั้นจุด 'เกลือ' จริงๆคือทำให้เป็นไปได้ยากมากที่โต๊ะสายรุ้งจะมีรหัสแฮชของรหัสผ่าน (เกลือ) ที่ปลอมปนในตอนแรก : D
Vaibhav

คำตอบ:


237

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

เกลือสาธารณะทำสองสิ่ง: ทำให้เสียเวลามากกว่าในการถอดรหัสรายการรหัสผ่านจำนวนมากและทำให้ไม่สามารถใช้ตารางสายรุ้งได้

เพื่อให้เข้าใจถึงสิ่งแรกลองนึกภาพไฟล์รหัสผ่านเดียวที่มีชื่อผู้ใช้และรหัสผ่านหลายร้อยรายการ ฉันสามารถคำนวณ "md5 (พยายาม [0])" แล้วสแกนไฟล์เพื่อดูว่าแฮชนั้นปรากฏที่ใดก็ได้ ถ้ามีเกลืออยู่ฉันต้องคำนวณ "md5 (เกลือ [a]. ลอง [0])", เปรียบเทียบกับรายการ A จากนั้น "md5 (เกลือ [b]. ลอง [0])" เปรียบเทียบกับรายการ B เป็นต้นตอนนี้ฉันมีnเวลาทำงานให้ทำมากมายที่nจำนวนชื่อผู้ใช้และรหัสผ่านที่มีอยู่ในไฟล์

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

แต่ถ้าไฟล์รหัสผ่านถูกใส่เกลือตารางรุ้งจะต้องมี "เกลือรหัสผ่าน" ก่อนการแฮช หากเกลือมีการสุ่มตัวอย่างอย่างเพียงพอก็ไม่น่าเป็นไปได้ ฉันอาจจะมีสิ่งต่าง ๆ เช่น "สวัสดี" และ "foobar" และ "qwerty" ในรายการรหัสผ่านที่ใช้กันทั่วไปที่ถูกแฮชล่วงหน้า (ตารางสายรุ้ง) แต่ฉันจะไม่มีสิ่งเช่น "jX95psDZhello" หรือ "LPgB0sdgxfoobar" หรือ "dZVUABJtqwerty" คำนวณล่วงหน้า นั่นจะทำให้ตารางสายรุ้งมีขนาดใหญ่

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


15
ฉันไม่แน่ใจว่าสิ่งที่ฉันพูดในคำตอบของฉันหมายความว่าพวกเขา?
Ross

2
erickson ฉันคิดว่าการแก้ไขนั้นทำให้เกิดความสับสน - ฉันไม่คิดว่าคนส่วนใหญ่คิดว่าการโจมตีแบบเรนโบว์เทเบิ้ลเป็นการโจมตีแบบพจนานุกรม แจ้งให้เราทราบหากมีบางสิ่งที่คุณคิดว่าสับสนในคำตอบของฉันและฉันจะพยายามแก้ไขให้ถูกต้อง
Ross

ฉันหวังว่าจะให้มากกว่าหนึ่ง upvote! โดยเฉพาะอย่างยิ่งสำหรับย่อหน้าแรก นั่นคือผลรวมทั้งหมดของ IMHO
Cesar

5
ฉันรู้ว่ามันเก่า แต่คำอธิบายของคุณเกี่ยวกับตารางรุ้งไม่ถูกต้อง คุณกำลังอธิบายตารางแฮชแทน สำหรับตารางรุ้งเห็นsecurity.stackexchange.com/questions/379/... ตารางแฮชมีการแมปรหัสผ่าน 1 ถึง 1 เพื่อแฮช (ตามที่คุณอธิบาย) แต่ตารางเรนโบว์ต้องการฟังก์ชั่นการลดซึ่งแปลงแฮชกลับเป็นข้อความธรรมดาเพื่อให้ได้รับการปรับปรุงหลายพันครั้งโดยเก็บเฉพาะข้อความเริ่มต้นและแฮชสุดท้าย การค้นหานั้นใช้เวลานานกว่าการแฮชตาราง แต่ 'จับ' ข้อความธรรมดาจำนวนมากต่อแฮช
มาร์คฟิชเชอร์

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

119

คำตอบอื่น ๆ ดูเหมือนจะไม่เข้าใจความเข้าใจผิดของคุณในหัวข้อดังนั้นที่นี่ไป:

การใช้เกลือสองแบบที่แตกต่างกัน

ฉันเคยเห็นแบบฝึกหัดมากมายที่แนะนำว่าเกลือถูกใช้ดังนี้:

$hash = md5($salt.$password)

[ ... ]

การใช้งานอื่นที่ฉันเห็นอยู่ในระบบ Linux ของฉัน ใน / etc / shadow รหัสผ่านที่ถูกแฮชจะถูกเก็บไว้พร้อมกับเกลือ

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

ความปลอดภัยของแฮช

ตอนนี้ใครบางคนที่มีตารางรุ้งสามารถย้อนแฮชและกลับมาพร้อมกับอินพุต "foobar"

[ ... ]

เนื่องจากแฮชย้อนกลับของ te5SBM.7C25fFDu6bIRbX เป็นที่รู้จักกันว่ามี "foo"

มันเป็นไปไม่ได้ที่จะย้อนแฮช (อย่างน้อยก็ในทางทฤษฎี) แฮชของ "foo" และแฮชของ "saltfoo" ไม่มีอะไรเหมือนกัน การเปลี่ยนแม้แต่หนึ่งบิตในอินพุตของฟังก์ชันแฮชการเข้ารหัสควรเปลี่ยนเอาต์พุตอย่างสมบูรณ์

ซึ่งหมายความว่าคุณไม่สามารถสร้างตารางสายรุ้งด้วยรหัสผ่านทั่วไปและต่อมา "ปรับปรุง" ด้วยเกลือบางอย่าง คุณต้องคำนึงถึงเกลือตั้งแต่ต้น

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

คุณภาพของเกลือ

แต่พูด $salt=foo

"foo" จะเป็นอย่างมากทางเลือกที่ดีของเกลือ โดยปกติแล้วคุณจะใช้ค่าสุ่มเข้ารหัสใน ASCII

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

การโจมตี

หากแฮ็กเกอร์สามารถใช้มือของเขากับไฟล์นี้ได้ฉันก็ไม่เห็นว่าเกลือมีจุดประสงค์อะไร

การโจมตีแบบ Rainbow table ต้องการเสมอ/etc/passwd (หรือใช้ฐานข้อมูลรหัสผ่านใด ๆ ) หรือคุณจะเปรียบเทียบแฮชในตารางรุ้งกับแฮชของรหัสผ่านจริงได้อย่างไร

สำหรับวัตถุประสงค์: สมมติว่าผู้โจมตีต้องการสร้างตารางสายรุ้งสำหรับคำศัพท์ภาษาอังกฤษที่ใช้กันทั่วไป 100,000 คำและรหัสผ่านทั่วไป (คิดว่า "ความลับ") หากไม่มีเกลือเธอจะต้องคำนวณล่วงหน้า 100,000 แฮช แม้จะใช้เกลือ UNIX แบบดั้งเดิมที่มีอักขระ 2 ตัว (แต่ละตัวเป็นหนึ่งใน 64 ตัวเลือก[a–zA–Z0–9./]:) เธอจะต้องคำนวณและเก็บแฮช 4,096,000,000 ตัวซึ่งค่อนข้างดีขึ้น


2
คำตอบที่ดีจริงๆ มันช่วยให้ฉันเข้าใจสิ่งต่าง ๆ ดีขึ้นมาก +1
wcm

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

5
@ จอนนี่ไม่มี "เกลือ" ประเด็นทั้งหมดคือเกลือนั้นแตกต่างกันสำหรับการป้อนรหัสผ่านทุกครั้ง

86

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

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


1
+1: เกลืออาจเป็นส่วนหนึ่งของการแยกเลขฐานสิบหกของสตริงสุ่มบางตัวที่สร้างโดยเครื่องกำเนิดตัวเลขสุ่ม แต่ละบิตเป็นแบบสุ่ม
S.Lott

5
"Rainbow tables เป็นรูปแบบหนึ่งของการโจมตีด้วยพจนานุกรมที่ให้ความเร็วสูงขึ้นเพื่อประหยัดพื้นที่เก็บข้อมูล" - จริง ๆ แล้วมันตรงกันข้ามโต๊ะสายรุ้งที่ดีสามารถใช้เก็บ GB ได้เพื่อประหยัดเวลาในการปรับค่าทั้งหมดที่เป็นไปได้
AviD

2
ตกลง - @erickson ฉันคิดว่าการแก้ไขของคุณไม่ถูกต้อง ตารางรุ้งต้องมีขนาดใหญ่ปริมาณของการจัดเก็บ แต่ทำให้มันได้อย่างรวดเร็วจะได้รับข้อความที่อยู่เบื้องหลังกัญชา
Carl Seleborg

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

... การโจมตี แต่คุณไม่จำเป็นต้องใช้ตารางสายรุ้งสำหรับการโจมตีพจนานุกรม
Rasmus Faber

35

อีกคำถามที่ยอดเยี่ยมพร้อมคำตอบที่รอบคอบมาก - +1 ถึงแล้ว!

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

ทำไมสิ่งนี้จึงสำคัญ

ลองนึกภาพฐานข้อมูลรหัสผ่านที่ บริษัท ซอฟต์แวร์รายใหญ่ทางตะวันตกเฉียงเหนือของสหรัฐอเมริกา สมมติว่ามันมี 30,000 รายการซึ่งมี 500 รหัสผ่านbluescreen สมมติว่าแฮ็กเกอร์จัดการเพื่อรับรหัสผ่านนี้โดยการอ่านจากอีเมลจากผู้ใช้ไปยังแผนกไอที หากรหัสผ่านไม่ปลอดภัยนักแฮกเกอร์สามารถค้นหาค่าแฮชในฐานข้อมูลจากนั้นเพียงจับคู่รูปแบบเพื่อเข้าถึงบัญชี 499 บัญชีอื่น ๆ

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


เหมือนกันสำหรับผู้ใช้สองคนที่เลือกรหัสผ่านที่แตกต่างกันและเป็นไปได้ว่าพวกเขามีรหัสผ่านที่แฮชเหมือนกันเก็บไว้ใน db (ไร้ประโยชน์ ... ฉันรู้)
Ant

15

ฉันกำลังค้นหาวิธีที่ดีในการใช้เกลือและพบบทความ excelent นี้ด้วยรหัสตัวอย่าง:

http://crackstation.net/hashing-security.htm

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

ในการจัดเก็บรหัสผ่าน:

  • สร้างเกลือสุ่มที่มีความยาวโดยใช้ CSPRNG
  • เติมเกลือลงในรหัสผ่านและแฮชด้วยฟังก์ชันแฮ็กเข้ารหัสแบบมาตรฐานเช่น SHA256
  • บันทึกทั้งเกลือและแฮชในบันทึกฐานข้อมูลของผู้ใช้

ในการตรวจสอบรหัสผ่าน:

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

3
Hashcat สามารถทดลองแฮช SHA256 ที่เค็มได้เกือบ 17 พันล้านต่อวินาทีโดยใช้พีซีเครื่องเดียว ผู้เขียนบทความที่เชื่อมโยงพูดถึงเรื่องนี้ภายใต้หัวข้อ "การสร้างรหัสผ่านการแคร็กยากยิ่งขึ้น: ฟังก์ชันแฮชช้า" scrypt, bcrypt และ PBKDF2 เป็นตัวเลือกที่ดีและคุ้มค่ากับวงจร CPU เพิ่มเติมบนเซิร์ฟเวอร์ IMHO ปัจจุบัน Argon2 เป็นสุดยอดของศิลปะ แต่ไม่ได้รับการทดสอบการต่อสู้เหมือนกับคนอื่น ๆ
kgriffs

12

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

ตัวอย่างของการใช้ 'foo' เป็นเกลืออาจทำให้ตารางรุ้งมีขนาดใหญ่ขึ้น 16 ล้านเท่า

จากตัวอย่างเกลือของคาร์ลที่มีขนาด 128 บิตทำให้ตารางนี้มีขนาดใหญ่ขึ้นเป็น 2 - 128 เท่า - ตอนนี้มันใหญ่แล้ว - หรืออีกวิธีหนึ่งก่อนที่ใครสักคนจะมีที่เก็บข้อมูลขนาดใหญ่แบบพกพา


8
แม้ว่าคุณจะใช้อิเล็กตรอนเดี่ยวในการจัดเก็บสักครู่มันก็จะค่อนข้างนานก่อนที่ทุกคนจะสร้างที่เก็บข้อมูลแบบพกพาที่มีความจุนั้น ... เว้นแต่คุณจะพิจารณาว่าระบบสุริยะเคลื่อนที่ผ่านกาแลคซีแบบพกพา
erickson

10

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

การโจมตีดังกล่าวไม่ได้ผลในกรณีที่รหัสผ่านมีอักขระจำนวนมากและไม่สอดคล้องกับรูปแบบคำทั่วไป ผู้ใช้ที่มีรหัสผ่านที่รัดกุมเพื่อเริ่มต้นจะไม่เสี่ยงต่อการถูกโจมตีแบบนี้ น่าเสียดายที่หลายคนไม่ได้รับรหัสผ่านที่ดี แต่มีการประนีประนอมคุณสามารถปรับปรุงรหัสผ่านของผู้ใช้โดยการเพิ่มขยะแบบสุ่มไป ดังนั้นตอนนี้แทนที่จะเป็น "hunter2" รหัสผ่านของพวกเขาอาจกลายเป็นได้อย่างมีประสิทธิภาพ "hunter2908! fld2R75 {R7 /; 508PEzoz ^ U430" ซึ่งเป็นรหัสผ่านที่แข็งแกร่งกว่ามาก อย่างไรก็ตามเนื่องจากตอนนี้คุณต้องจัดเก็บส่วนประกอบรหัสผ่านเพิ่มเติมนี้ซึ่งจะช่วยลดประสิทธิภาพของรหัสผ่านแบบรวมที่เข้มงวดขึ้น มันกลับกลายเป็นว่ายังมีประโยชน์สุทธิสำหรับรูปแบบดังกล่าวตั้งแต่ตอนนี้แต่ละรหัสผ่านแม้แต่รหัสที่อ่อนแอ จะไม่มีความเสี่ยงต่อตารางแฮช / สายรุ้งที่คำนวณล่วงหน้าได้อีกต่อไป แต่รายการแฮชรหัสผ่านแต่ละรายการจะมีความเสี่ยงเฉพาะกับตารางแฮชที่ไม่ซ้ำกันเท่านั้น

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

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

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


3

วัตถุประสงค์หนึ่งของการเติมเกลือคือการเอาชนะตารางแฮชที่คำนวณล่วงหน้า หากใครบางคนมีรายการ hash ที่คำนวณล่วงหน้าได้หลายล้านรายการพวกเขาจะไม่สามารถค้นหา $ 1 $ foo $ te5SBM.7C25fFDu6bIRbX1 ในตารางของพวกเขาแม้ว่าพวกเขาจะรู้จักแฮชและเกลือ พวกเขาจะยังคงต้องเดรัจฉานบังคับมัน

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

วัตถุประสงค์ทั้งสองนี้ยังคงทำได้แม้ว่าเกลือนั้นจะถูกเปิดเผยสู่สาธารณะ


1

เท่าที่ฉันรู้เกลือมีจุดประสงค์เพื่อให้การโจมตีพจนานุกรมยากขึ้น

เป็นความจริงที่ทราบกันดีว่าหลายคนจะใช้คำทั่วไปสำหรับรหัสผ่านแทนที่จะเป็นสตริงสุ่ม

ดังนั้นแฮกเกอร์สามารถใช้สิ่งนี้เพื่อประโยชน์ของเขาแทนที่จะใช้กำลังดุร้าย เขาจะไม่มองหารหัสผ่านเช่น aaa, aab, aac ... แต่แทนที่จะใช้คำและรหัสผ่านทั่วไป (เช่นชื่อลอร์ดออฟเดอะริงส์!;))

ดังนั้นหากรหัสผ่านของฉันคือเลโกลัสแฮกเกอร์สามารถลองและเดาด้วยความพยายาม "น้อย" อย่างไรก็ตามหากเราใส่รหัสผ่านและกลายเป็น fooLegolas แฮชจะแตกต่างกันดังนั้นการโจมตีพจนานุกรมจะไม่สำเร็จ

หวังว่าจะช่วย!


-2

ฉันคิดว่าคุณกำลังใช้ PHP --- md5 () ฟังก์ชั่นและ $ นำหน้าตัวแปร --- จากนั้นคุณสามารถลองดูบทความนี้รหัสผ่านเงา HOWTOพิเศษวรรคที่ 11

นอกจากนี้คุณกลัวที่จะใช้อัลกอริธึมการแยกย่อยข้อความคุณสามารถลองใช้อัลกอริธึมการเข้ารหัสจริงเช่นที่จัดเตรียมโดยโมดูลmcryptหรืออัลกอริทึมการแยกย่อยข้อความที่แรงกว่าเช่นที่ให้โมดูลmhash (sha1, sha256 และ อื่น ๆ )

ฉันคิดว่าอัลกอริทึมการแยกย่อยข้อความที่แข็งแกร่งเป็นสิ่งจำเป็น เป็นที่รู้กันว่า MD5 และ SHA1 กำลังประสบปัญหาการชน

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