ความจำเป็นในการซ่อนเกลือสำหรับกัญชา


99

ในที่ทำงานเรามีสองทฤษฎีที่แข่งขันกันสำหรับเกลือ ผลิตภัณฑ์ที่ฉันทำงานใช้บางอย่างเช่นชื่อผู้ใช้หรือหมายเลขโทรศัพท์เพื่อเพิ่มแฮช โดยพื้นฐานแล้วสิ่งที่แตกต่างกันสำหรับผู้ใช้แต่ละคน แต่พร้อมสำหรับเรา ผลิตภัณฑ์อื่น ๆ จะสุ่มสร้างเกลือสำหรับผู้ใช้แต่ละรายและจะเปลี่ยนแปลงทุกครั้งที่ผู้ใช้เปลี่ยนรหัสผ่าน จากนั้นเกลือจะถูกเข้ารหัสในฐานข้อมูล

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

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

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

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

การมีเกลือที่แตกต่างกันสำหรับแต่ละรายการหมายความว่าฉันไม่สามารถใช้ตารางสายรุ้งเดียวกันได้ (จริงๆแล้วในทางเทคนิคฉันทำได้ถ้าฉันมีขนาดที่เพียงพอ แต่ขอเพิกเฉยต่อสิ่งนั้นในขณะนี้) นี่คือกุญแจสำคัญที่แท้จริงของเกลือจากสิ่งที่ฉันเข้าใจเพราะในการแตกทุกบัญชีฉันต้องสร้างวงล้อขึ้นมาใหม่เพื่อที่จะพูดถึงแต่ละบัญชี ตอนนี้ถ้าฉันรู้วิธีใช้เกลือที่ถูกต้องกับรหัสผ่านเพื่อสร้างแฮชฉันจะทำเพราะเกลือนั้นขยายความยาว / ความซับซ้อนของวลีที่แฮช ดังนั้นฉันจะตัดจำนวนชุดค่าผสมที่เป็นไปได้ที่ฉันต้องสร้างเพื่อ "รู้" ฉันมีรหัสผ่าน + เกลือจาก 13 ^ 26 เป็น 8 ^ 26 เพราะฉันรู้ว่าเกลือคืออะไร ตอนนี้ทำให้ง่ายขึ้น แต่ก็ยังยากจริงๆ

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

นี่คือลิงค์ที่อธิบายว่ารหัสผ่านจะคงอยู่ได้นานแค่ไหนภายใต้การโจมตีแบบดุร้าย: http://www.lockdown.co.uk/?pg=combi


คำถามที่ดีเควินตรงเวลามาก ฉันไม่สามารถแสดงความคิดเห็นเกี่ยวกับความปลอดภัยได้ แต่มีประสิทธิภาพสำหรับการเข้ารหัสและถอดรหัสทั้งหมดนี้แน่นอน
DOK

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

สิ่งที่ทำให้ฉันได้รับคือฉันไม่แน่ใจว่าโต๊ะสายรุ้งขนาดนั้นจะใช้เวลาสร้างนานขนาดนั้น เขาเป็นไอเดียแปลกประหลาดใช้แพลตฟอร์มคอมพิวเตอร์แบบกระจายเช่น Kraken (จริงๆแล้วมันคืออะไร) เพื่อสร้างมัน ใช้เวลานานแค่ไหน?
kemiller2002

3
@Kevin: SHA1 ส่งคืนสตริงเลขฐานสิบหกอักขระดังนั้นจึงมีค่าส่งคืนที่เป็นไปได้ 40 ^ 16 สมมติว่าคอมพิวเตอร์เครื่องเดียวสามารถคำนวณได้ 1,000 แฮชทุก ๆ วินาทีฉันคำนวณคอมพิวเตอร์ 1,000,000 เครื่องจะใช้เวลาประมาณ 10,000 ล้านปีในการสร้างตารางสายรุ้งที่สามารถกำหนดสตริงขนาดนั้น
tloach

+1 คำถามที่ดีและคุณอ่านดี ฉันคิดว่าคุณมีคำตอบที่ผิดสำหรับคำถามนี้ ควรเป็นความลับเสมอเนื่องจากแฮชไม่สามารถหักได้จนกว่าจะได้รับ คุณควรอ่านเกี่ยวกับ CWE-760 ( cwe.mitre.org/data/definitions/760.html )
rook

คำตอบ:


45

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


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

ตาราง ranbow จากรหัสผ่านที่ใช้กันทั่วไป 1,000 รหัสจะทำลายสิ่งนี้ด้วยความเร็วเกือบเท่ากับการแฮช วิธีเดียวที่จะได้ผลคือถ้าคุณถือว่าการกระจายรหัสผ่านของคุณเป็นแบบเดียวกัน .. และเรารู้ว่ามันไม่ใช่
DaWNFoRCe

100

การซ่อนเกลือเป็นสิ่งที่ไม่จำเป็น

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

จากคำตอบก่อนหน้าของฉัน :

เกลือช่วยขัดขวางการโจมตีของพจนานุกรมที่คำนวณไว้ล่วงหน้า

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

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

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


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


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


1
การซ่อนเกลือเป็นสิ่งที่จำเป็นเนื่องจากไม่สามารถหักกัญชาได้จนกว่าจะได้รับ สิ่งนี้เกี่ยวข้องกับ CWE-760 ( cwe.mitre.org/data/definitions/760.html )
rook

28
@ The Rook - ไม่คุณตีความประเด็นนั้นผิด หมายถึงการใช้เกลือที่คาดเดาได้ มันไม่ได้พูดอะไรเกี่ยวกับการรักษาความลับของเกลือ อันที่จริงคุณไม่สามารถเก็บความลับของเกลือได้โดยไม่ใช้ความลับอื่น ... ในกรณีนี้ทำไมคุณไม่ใช้ความลับที่สองเป็นเกลือล่ะ? การใช้ชื่อผู้ใช้เป็นเกลือนั้นไม่ดีเนื่องจากมีความเป็นไปได้ที่หลายระบบจะใช้ชื่อผู้ใช้เดียวกันทำให้คุ้มค่ากว่าในการสร้างตารางสำหรับเกลือนั้น ๆ เกลือแบบสุ่มดีที่สุด แต่ไม่จำเป็นต้องเก็บเป็นความลับ
erickson

ดูเพิ่มเติมที่: stackoverflow.com/questions/1645161/…
Jacco

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

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

3

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


3

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

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


พวกเขาป้องกันการโจมตีจากพจนานุกรมได้อย่างไร?
tloach

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

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

1
@ บิล: คุณเพิ่งอธิบายตารางสายรุ้ง การโจมตีด้วยพจนานุกรมเป็นที่ที่ฉันใช้คำปกติและพยายามตรวจสอบสิทธิ์กับคำเหล่านั้น มันเป็นสัตว์เดรัจฉานที่มีช่องว่างคำตอบลดลง ไม่มีแฮชป้องกันพลังเดรัจฉาน
tloach

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

3

... บางอย่างเช่นชื่อผู้ใช้หรือหมายเลขโทรศัพท์เพื่อเพิ่มแฮช ...

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

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

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


2
ไม่ต้องพูดถึงว่าคุณกำลังใช้ข้อมูลผู้ใช้บางส่วนโดยพลการเมื่อพวกเขาเปลี่ยนข้อมูลนั้นคุณต้องให้พวกเขาป้อนรหัสผ่านอีกครั้งเพื่อให้คุณสามารถเข้ารหัสอีกครั้งด้วยเกลือใหม่
Treborbob

3

เกลือที่ซ่อนอยู่ไม่ใช่เกลืออีกต่อไป มันคือพริกไทย มันมีประโยชน์ มันแตกต่างจากเกลือ

Pepper เป็นรหัสลับที่เพิ่มลงในรหัสผ่าน + เกลือซึ่งทำให้แฮชเป็น HMAC (Hash Based Message Authentication Code) แฮ็กเกอร์ที่สามารถเข้าถึงเอาต์พุตแฮชและเกลือในทางทฤษฎีสามารถคาดเดาอินพุตที่จะสร้างแฮช (ดังนั้นจึงผ่านการตรวจสอบความถูกต้องในกล่องข้อความรหัสผ่าน) การเพิ่มพริกไทยจะช่วยเพิ่มพื้นที่ปัญหาด้วยวิธีการสุ่มแบบเข้ารหัสทำให้ปัญหาว่ายากโดยไม่ต้องใช้ฮาร์ดแวร์

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับพริกไทยตรวจสอบที่นี่

ดูhmacด้วย


2

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

พิจารณาตารางต่อไปนี้

UserId  UserName,   Password
     1  Fred       Hash1 =  Sha(Salt1+Password1)    
     2  Ted        Hash2 =  Sha(Salt2+Password2)    

กรณีที่ 1 เมื่อ salt 1 เหมือนกับ salt2 ถ้า Hash2 ถูกแทนที่ด้วย Hash1 ผู้ใช้ 2 สามารถเข้าสู่ระบบด้วยรหัสผ่านของผู้ใช้ 1

กรณีที่ 2 เมื่อเกลือ 1 ไม่ใช่เกลือเดียวกัน 2 หาก Hash2 ถูกแทนที่ด้วย Hash1 ผู้ใช้ 2 จะไม่สามารถเข้าสู่ระบบด้วยรหัสผ่านของผู้ใช้ 1


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

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

1

มีสองเทคนิคโดยมีเป้าหมายที่แตกต่างกัน:

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

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


0

ฉันมักจะซ่อนเกลือ ฉันใช้เกลือ 10 บิตโดยใส่ตัวเลขสุ่มล่วงหน้า 1 ถึง 1024 ไปยังจุดเริ่มต้นของรหัสผ่านก่อนที่จะแฮช เมื่อเปรียบเทียบรหัสผ่านที่ผู้ใช้ป้อนกับแฮชฉันจะวนจาก 1 ถึง 1024 และลองค่าเกลือทุกค่าที่เป็นไปได้จนกว่าฉันจะพบข้อมูลที่ตรงกัน ใช้เวลาน้อยกว่า 1/10 วินาที ผมมีความคิดที่จะทำมันด้วยวิธีนี้จาก PHP password_hashและpassword_verify ในตัวอย่างของฉัน "ต้นทุน" คือ 10 สำหรับเกลือ 10 บิต หรือจากสิ่งที่ผู้ใช้รายอื่นกล่าวว่า "เกลือ" ที่ซ่อนอยู่เรียกว่า "พริกไทย" เกลือไม่ได้เข้ารหัสในฐานข้อมูล มันถูกบังคับให้ออกไป มันจะทำให้ตารางสายรุ้งจำเป็นต้องย้อนกลับแฮชที่ใหญ่กว่า 1,000 เท่า ฉันใช้ sha256 เพราะมันเร็ว แต่ก็ยังถือว่าปลอดภัย


ดังนั้นหากรหัสผ่านของฉันคือ "345678" และเกลือแบบสุ่มที่คุณใส่ไว้ข้างหน้าให้พูดว่า "12" หากมีคนป้อน "45678" เป็นรหัสผ่านของฉัน สิ่งนี้ดูเหมือนผิดในหลาย ๆ ด้าน
Yurippenet

-1

จริงๆแล้วมันขึ้นอยู่กับประเภทของการโจมตีที่คุณพยายามปกป้องข้อมูลของคุณ

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

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

Marianne2ae85fb5d

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


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