SHA-1 มีความปลอดภัยสำหรับการจัดเก็บรหัสผ่านหรือไม่?


148

สรุป: SHA-1 มีความปลอดภัยเทียบเท่ากับสิ่งใด ๆ ก็ตามจากการโจมตีของ preimage อย่างไรก็ตามมันง่ายในการคำนวณซึ่งหมายความว่าง่ายต่อการติดตั้งการโจมตีแบบ bruteforce หรือพจนานุกรม (เช่นเดียวกับผู้สืบทอดเช่น SHA-256) ฟังก์ชั่นแฮชซึ่งได้รับการออกแบบให้มีราคาแพงในการคำนวณ (เช่น bcrypt) อาจเป็นทางเลือกที่ดีกว่า


บางคนพูดอย่างเช่น "SHA-1 เสีย" มากดังนั้นฉันพยายามที่จะเข้าใจความหมายที่แท้จริง สมมติว่าฉันมีฐานข้อมูลของรหัสผ่านแฮช SHA-1 และผู้โจมตีที่มีอัลกอริทึมการทำลาย SHA-1 ที่ทันสมัยและบอตเน็ตที่มี 100,000 เครื่องเข้าถึงได้ (การควบคุมคอมพิวเตอร์ที่ใช้ภายในบ้านมากกว่า 100k หมายความว่าพวกเขาสามารถทำงานได้ประมาณ 10 ^ 15 ต่อวินาที) พวกเขาจะต้องใช้เวลานานเท่าใด

  1. ค้นหารหัสผ่านของผู้ใช้คนใดคนหนึ่งหรือไม่
  2. ค้นหารหัสผ่านของผู้ใช้ที่กำหนดหรือไม่
  3. ค้นหารหัสผ่านของผู้ใช้ทั้งหมดหรือไม่
  4. หาวิธีเข้าสู่ระบบในฐานะผู้ใช้คนใดคนหนึ่ง?
  5. หาวิธีเข้าสู่ระบบในฐานะผู้ใช้เฉพาะหรือไม่?

จะเปลี่ยนไปอย่างไรหากรหัสผ่านถูกใส่เกลือ วิธีการเติมเกลือ (คำนำหน้า, คำนำหน้า, ทั้งสองหรือบางสิ่งที่ซับซ้อนกว่าเช่น xor-ing) มีความสำคัญหรือไม่?

นี่คือความเข้าใจปัจจุบันของฉันหลังจาก googling โปรดแก้ไขคำตอบหากฉันเข้าใจผิดบางอย่าง

  • หากไม่มีเกลือการโจมตีแบบสายรุ้งจะค้นหารหัสผ่านทั้งหมดทันที (ยกเว้นรหัสที่ยาวมาก)
  • หากมีเกลือสุ่มนานพอวิธีที่มีประสิทธิภาพที่สุดในการค้นหารหัสผ่านคือการใช้กำลังดุร้ายหรือการโจมตีพจนานุกรม การชนกันของข้อมูลหรือการโจมตีล่วงหน้าไม่ได้มีส่วนช่วยในการค้นหารหัสผ่านจริงดังนั้นการโจมตีด้วยรหัสลับกับ SHA-1 จึงไม่ช่วยอะไรเลย มันไม่สำคัญเลยว่าอัลกอริทึมใดที่ใช้ - ใครสามารถใช้ MD5 หรือ MD4 และรหัสผ่านจะปลอดภัยเหมือนกัน (มีความแตกต่างกันเล็กน้อยเนื่องจากการคำนวณแฮช SHA-1 ช้ากว่า)
  • ในการประเมินความปลอดภัย "เพียงแค่ปลอดภัย" สมมติว่าการรัน sha1 ครั้งเดียวนั้นใช้เวลา 1,000 การดำเนินการและรหัสผ่านประกอบด้วยตัวพิมพ์ใหญ่ตัวพิมพ์เล็กและตัวเลข (นั่นคือ 60 ตัวอักษร) นั่นหมายความว่าผู้โจมตีสามารถทดสอบ 10 15 * 60 * 60 * 24/1000 ~ = 10 17รหัสผ่านที่เป็นไปได้ต่อวัน สำหรับการโจมตีที่ดุร้ายนั่นหมายถึงการทดสอบรหัสผ่านทั้งหมดสูงสุด 9 ตัวอักษรใน 3 ชั่วโมงสูงสุด 10 ตัวอักษรในหนึ่งสัปดาห์มากถึง 11 ตัวอักษรในหนึ่งปี (ใช้เวลาเพิ่มขึ้น 60 เท่าสำหรับตัวละครทุกตัว) การโจมตีพจนานุกรมนั้นเร็วกว่ามาก (แม้แต่ผู้โจมตีที่ใช้คอมพิวเตอร์เครื่องเดียวก็สามารถดึงมันออกได้ในเวลาไม่กี่ชั่วโมง) แต่จะพบรหัสผ่านที่อ่อนแอเท่านั้น
  • ในการเข้าสู่ระบบในฐานะผู้ใช้ผู้โจมตีไม่จำเป็นต้องค้นหารหัสผ่านที่แน่นอน มันก็เพียงพอที่จะหาสตริงที่ส่งผลให้แฮชเดียวกัน นี่เรียกว่าการโจมตีครั้งแรก เท่าที่ฉันสามารถหาได้ไม่มีการโจมตีล่วงหน้ากับ SHA-1 (การโจมตี Bruteforce จะใช้เวลา 2 160การดำเนินงานซึ่งหมายถึงการโจมตีทางทฤษฎีเราจะต้อง 10 30ปีที่จะดึงมันออก. ขอบเขตของความเป็นไปได้ในทางทฤษฎีมีรอบ 2 60การดำเนินงานที่การโจมตีจะใช้เวลาไม่กี่ปีที่ผ่านมา.) มีการโจมตี preimage เทียบกับรุ่นที่ลดลงของ SHA-1 ที่มีเอฟเฟกต์เล็กน้อย (สำหรับ SHA-1 ที่ลดลงซึ่งใช้ 44 ขั้นตอนแทน 80, เวลาโจมตีลดลงจาก 2 160การดำเนินการเป็น 2 157) มีการโจมตีการปะทะกันกับ SHA-1 ซึ่งมีความเป็นไปได้ในทางทฤษฎี ( ที่ดีที่สุดที่ฉันค้นพบทำให้เวลาลดลงจาก 2 80เป็น 2 52 ) แต่สิ่งเหล่านั้นไร้ประโยชน์สำหรับการแฮชรหัสผ่าน

กล่าวโดยสรุปการจัดเก็บรหัสผ่านด้วย SHA-1 ดูเหมือนปลอดภัยอย่างสมบูรณ์ ฉันพลาดอะไรไปหรือเปล่า?

ปรับปรุง:มาร์เซโลชี้ให้เห็นบทความที่ระบุว่าการโจมตี preimage ที่สองใน 2 106การดำเนินงาน ( แก้ไข:ตามที่โทมัสอธิบายการโจมตีนี้เป็นสิ่งก่อสร้างเชิงสมมุติฐานซึ่งไม่สามารถนำไปใช้กับสถานการณ์ในชีวิตจริงได้) ฉันยังไม่เห็นว่าสิ่งนี้จะเป็นอันตรายต่อการใช้งาน SHA-1 อย่างไร โดยทั่วไปมีเหตุผลที่ดีหรือไม่ที่คิดว่าการโจมตีแบบชนกันหรือการโจมตีแบบ preimage ครั้งที่สองสามารถเปลี่ยนเป็นการโจมตีแบบ preimage เป็นครั้งแรกได้หรือไม่?


นี่คือตอนนี้อายุ 7 ปีและเกิดขึ้นมากมายตั้งแต่ได้รับการแก้ไขครั้งล่าสุด SHA-1 ไม่ได้รับการพิจารณาว่าปลอดภัยเพียงพอสำหรับการ
แฮ็ก

@GordonM เกิดอะไรขึ้น ด้วยการเติบโตของพลังการประมวลผลการโจมตีของการชนกันของ SHA-1 ได้กลายเป็นจริงมากขึ้น แต่ก็ไม่เกี่ยวข้องกันมากนัก SHA-1 ไม่เคยปลอดภัยอย่างแท้จริงสำหรับการแฮ็กรหัสผ่าน (โดยทั่วไปแฮ็ชเร็วไม่ใช่) แต่เท่าที่เป็นก็ยังคงเป็น AFAIK
Tgr

SHA-1 ไม่ปลอดภัยสำหรับการแฮ็กรหัสผ่านเพราะมันไม่เคยตั้งใจจะรักษารหัสผ่านในตอนแรก ...
Azxdreuwa

คำตอบ:


209

คำตอบสั้น ๆ สำหรับคำถามของคุณคือ: SHA-1 ปลอดภัยที่สุดเท่าที่จะทำได้ MD5 ก็ใช้ได้เช่นกันแม้แต่ MD4; แต่มันอาจทำให้นักลงทุนบางคนกังวล สำหรับการประชาสัมพันธ์ควรใช้ฟังก์ชันแฮช "ดีกว่า" เช่น SHA-256 แม้ว่าคุณจะตัดทอนเอาต์พุตเป็น 160 หรือ 128 บิต (เพื่อประหยัดค่าใช้จ่ายในการจัดเก็บ) ผู้สมัครบางคนของSHA-3 round-2ดูเหมือนจะเร็วกว่า SHA-1 ในขณะที่เนื้อหามีความปลอดภัยมากกว่า แต่มันก็ยังใหม่อยู่ดังนั้นการติด SHA-256 หรือ SHA-512 จะเป็นเส้นทางที่ปลอดภัยกว่าในตอนนี้ มันจะทำให้คุณดูเป็นมืออาชีพและระมัดระวังซึ่งเป็นสิ่งที่ดี

โปรดทราบว่า "ปลอดภัยที่สุดเท่าที่คุณจะทำได้" นั้นไม่เหมือนกับ "ปลอดภัยอย่างสมบูรณ์" ดูคำอธิบายที่ค่อนข้างยาวด้านล่าง

เกี่ยวกับการโจมตีที่รู้จัก:

การโจมตีที่รู้จักใน MD4, MD5 และ SHA-1 นั้นเกี่ยวกับการชนซึ่งไม่ส่งผลกระทบต่อการต้านทานของ preimage มันแสดงให้เห็นว่า MD4 มีจุดอ่อนเล็กน้อยซึ่งสามารถนำไปใช้ประโยชน์ทางทฤษฎีได้เมื่อพยายามทำลาย HMAC / MD4 แต่สิ่งนี้ไม่สามารถนำไปใช้กับปัญหาของคุณได้ การจู่โจมก่อนหน้านี้ 2 106วินาทีในกระดาษโดย Kesley และ Schneier เป็นการแลกเปลี่ยนแบบทั่วไปซึ่งใช้กับอินพุตที่ยาวมากเท่านั้น (2 60ไบต์; นั่นคือหนึ่งล้านเทราไบต์ - สังเกตได้ว่า 106 + 60 เกิน 160 นั่นคือจุดที่คุณเห็นว่า การแลกเปลี่ยนไม่มีอะไรวิเศษในนั้น)

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

เกี่ยวกับตารางรุ้ง:

"การโจมตีสายรุ้ง" เป็นการแบ่งปันต้นทุนของพจนานุกรมหรือการโจมตีด้วยกำลังดุร้าย มันเป็นอนุพันธ์จากการแลกเปลี่ยนหน่วยความจำเวลาครั้งแรกที่ Hellman อธิบายไว้ในปี 1980 สมมติว่าคุณมีรหัสผ่านN ที่เป็นไปได้ (นั่นคือขนาดของพจนานุกรมของคุณหรือ 2 nหากคุณพิจารณาการบังคับให้แฮชฟังก์ชั่นn bits) มีการโจมตีแบบแบ่งเวลาซึ่งคุณ precompute รหัสผ่านที่แฮชNและเก็บไว้ในตารางขนาดใหญ่ หากคุณเรียงลำดับแฮชเอาต์พุตคุณสามารถขอรับรหัสผ่านของคุณในการค้นหาครั้งเดียว ตารางรุ้งเป็นวิธีที่ฉลาดในการจัดเก็บตารางที่มีพื้นที่ลดลงมาก คุณเก็บรหัสผ่านที่แฮชไว้เท่านั้นN / tและคุณถอดรหัสรหัสผ่านด้วย O (t 2 ) การค้นหา ตาราง Rainbow ช่วยให้คุณสามารถจัดการกับตารางที่คำนวณล่วงหน้าที่มีขนาดใหญ่กว่าสิ่งที่คุณสามารถจัดเก็บได้จริง

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

  1. การโจมตีแบบ brute-force / dictionary มีค่าใช้จ่ายNสำหรับการถอดรหัสแต่ละรหัสผ่าน
  2. ด้วยตารางที่คำนวณล่วงหน้าผู้โจมตีจะจ่ายค่าใช้จ่ายN ครั้งเดียวและหลังจากนั้นสามารถโจมตีรหัสผ่านจำนวนมากด้วยค่าใช้จ่ายเพิ่มเติมเล็กน้อยต่อรหัสผ่าน
  3. หากตารางที่คำนวณล่วงหน้าเป็นตารางสายรุ้งดังนั้นNสามารถค่อนข้างใหญ่กว่าเนื่องจากค่าใช้จ่ายในการจัดเก็บจะลดลง คอขวดในNกลายเป็นพลัง CPU ที่ผู้โจมตีสามารถรวบรวมได้ไม่ใช่ขนาดของฮาร์ดดิสก์ของเขา

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

เกี่ยวกับเกลือ:

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

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

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

นอกจากนี้การเติมเกลือนั้นเป็นสิ่งที่ดีสำหรับการประชาสัมพันธ์

เกี่ยวกับค่าใช้จ่าย SHA-1:

ค่าใช้จ่ายเบื้องต้นของ SHA-1 นั้นเกี่ยวกับการ hashing บล็อก 64- ไบต์ นั่นคือวิธีการทำงานของ SHA-1: ข้อมูลถูกทำให้แน่นแล้วแยกออกเป็นบล็อกขนาด 64 ไบต์ ค่าใช้จ่ายในการประมวลผลบล็อกเดียวคือประมาณ 500 รอบนาฬิกาในระบบ Intel Core2 และนั่นเป็นเพียงแกนเดียว MD5 และ MD4 นั้นเร็วขึ้นนับได้ประมาณ 400 และ 250 รอบตามลำดับ อย่าลืมว่า CPU ที่ทันสมัยส่วนใหญ่มีหลายคอร์ดังนั้นคูณด้วย

แผนการเกลือบางอย่างกำหนดเกลือขนาดใหญ่; เช่นสิ่งที่เข้าสู่ฟังก์ชั่นแฮชเป็นจริง 40000 สำเนาต่อเนื่องของเกลือ 128 บิตเดียวตามด้วยรหัสผ่านตัวเอง รหัสผ่านนี้ทำให้การแฮ็ชรหัสผ่านมีราคาแพงกว่า (โดยตัวอย่างของฉันมีอยู่ 10,000 ตัว) ทั้งสำหรับผู้ใช้ที่ชอบด้วยกฎหมายและสำหรับผู้โจมตี นี่เป็นความคิดที่ดีหรือไม่ขึ้นอยู่กับการตั้งค่า สำหรับการเข้าสู่ระบบบนเดสก์ท็อปสิ่งนี้ดี: ผู้ใช้จะไม่สังเกตเห็นว่าใช้เวลา 10ms ในการแฮรหัสผ่านแทนที่จะเป็น 1µs แต่ค่าใช้จ่ายสำหรับผู้โจมตีเพิ่มขึ้นจากปัจจัยที่เห็นได้ชัดเจน 10,000 ในเซิร์ฟเวอร์ที่ใช้ร่วมกับลูกค้าหลายพันคนต่อวินาทีค่าใช้จ่ายรวมอาจกลายเป็นข้อห้าม ตามหลักการแล้วการยกระดับแถบด้วยปัจจัยเดียวกันสำหรับผู้ใช้ที่ถูกกฎหมายและผู้โจมตีนั้นไม่ใช่ความปลอดภัยที่ดีที่สุด แต่มันอาจเป็นความคิดที่คุ้มค่าในบางสถานการณ์

เกี่ยวกับการโจมตีออนไลน์:

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

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


5
คำตอบที่ยอดเยี่ยม บิตเดียวที่ฉันไม่เห็นด้วยคือ "แนวคิดการเพิ่มบาร์ด้วยปัจจัยเดียวกันสำหรับผู้ใช้ที่ชอบด้วยกฎหมายและผู้โจมตีไม่ได้รับการรักษาความปลอดภัยที่ดีที่สุด" - ผู้โจมตีต้องดำเนินการหลายอย่างที่ผู้ใช้ต้องทำ การเพิ่มหนึ่งรอบสัญญาณนาฬิกาสำหรับการเข้าสู่ระบบของผู้ใช้จะเพิ่มเป็นล้าน ๆ สำหรับผู้โจมตี
Nick Johnson

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

1
เป็นเพียงมุมมองของฉัน แต่ทำไมคุณถึงติด SHA1 เมื่อการเข้ารหัสรหัสผ่านที่แข็งแกร่งนั้นมีอยู่ในวงกว้าง? หนึ่งปีที่ผ่านมา MD5 ได้รับการพิจารณาว่า "ปลอดภัย" และตอนนี้ก็ไม่ใช่ - เหมือนกันที่จะเกิดขึ้นกับ SHA1 ได้ทุกวันสำหรับทุกสิ่งที่เรารู้ โดยส่วนตัวฉันจะวางเดิมพันปลาปักเป้าจากจุดนี้ไปข้างหน้า - ดูเหมือนว่าจะมีตัวแทนที่ดีขึ้นและมีความกังวลน้อยลงในชุมชน crypto มันมีอยู่เกือบทุกที่ดังนั้นจึงไม่มีเหตุผลที่จะเดิมพันกับ SHA1
mindplay.dk

1
ฉันช็อคที่แกนกลางของฉันเพื่อหลงทางคำตอบจาก @ThomasPornin ว่า MD5 ปลอดภัยสำหรับการจัดเก็บรหัสผ่าน ถ้า MD5 ใช้ได้ทำไมทุกอย่างถึงบอกว่าไม่ใช้มันให้ใช้ bcrypt ?? พวกเขากำลัง overcautious? ฉันได้อ่านและเข้าใจทุกสิ่งและอยู่ภายใต้ความประทับใจ MD5 นั้นแย่มากเพราะมีความเสี่ยงต่อการถูกดุร้าย ความคิดเห็นเมื่อเร็ว ๆ นี้เมื่อหนึ่งปีที่ผ่านมาอย่าโต้แย้งคำตอบ ...
ชั่วคราว

1
@Aerovistae: คุณอาจต้องการดูคำตอบในเว็บไซต์ security.SE; มันมีการวิเคราะห์มากขึ้นและรายละเอียดล่าสุดเกี่ยวกับการแฮ็รหัสผ่าน
โทมัสพริน

30

คำตอบก่อนหน้านี้ไม่ได้กล่าวถึง GPU ใด ๆ ซึ่งสามารถเทียบเคียงกับ SHA-1 hashing ได้ในระดับที่ฐานข้อมูลทั้งหมดสามารถถูกเดรัจฉานได้ในไม่กี่นาทีหรือชั่วโมงแทนที่จะเป็นวันหรือสัปดาห์แม้ว่ารหัสผ่านจะได้รับการใส่เกลือก็ตาม

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

ในระยะสั้นคุณควรใช้เครื่องมือที่ดีที่สุดสำหรับงาน และ SHA-1 นั้นสั้นมากเมื่อเทียบกับสถานะของศิลปะ

สำหรับการอ่านเพิ่มเติม:


2
"อัลกอริทึมแฮชรหัสผ่านที่ทันสมัยเช่น bcrypt หรือ PBKDF2 ได้รับการออกแบบมาโดยเฉพาะเพื่อให้ทำงานบน GPU ได้ยาก" - คุณหมายถึง "bcrypt หรือ scrypt" หรือไม่? PBKDF2 เป็นเพียงการทำซ้ำ hashing ไม่มีสิ่งใดในนั้นที่จะเป็นปัญหากับ GPU
Tgr

4
โปรดแจ้งให้เราทราบว่าคุณใช้ GPU ตัวใดฉันจะซื้อตัวเดิม หากคุณสามารถทำการคำนวณ 2 ^ 160 SHA-1 ใน "นาที" (ซึ่งจะน้อยกว่า "ชั่วโมง" ดังนั้นมากที่สุด 59 นาที) คุณจะต้องสามารถทำงานได้มากกว่า 10 ^ 44 ต่อวินาที เนื่องจาก PCIe ถ่ายโอนข้อมูลด้วยความเร็ว 128GT / s GPU ของคุณจะต้องมีหน่วยความจำในตัวที่ยอดเยี่ยมเช่นกัน ฉันต้องการมัน.
Damon

3
@Damon: ดูเหมือนว่าคุณสมมติว่าผู้ใช้มีรหัสผ่าน "trivial" (<8 บิตของเอนโทรปี) หรือรหัสผ่าน "ไม่สามารถแตกได้" (> 60 บิตของเอนโทรปี) คุณไม่สนใจทุกคนในระหว่างที่เอนโทรปีของรหัสผ่านอยู่ในช่วง 10-60 บิต นั่นคือผู้ใช้ที่ bcrypt, เรนโบว์ตารางและ GPU และพวกเขามักจะทำขึ้นประมาณ 80% ของฐานผู้ใช้ทั่วไป
jammycakes

1
(อุ๊ปส์ ... ฉันควรจะพูดว่า "นั่นคือผู้ใช้ที่ bcrypt, ตารางสายรุ้งและ GPU สร้างความแตกต่างที่ยิ่งใหญ่ที่สุด")
jammycakes

3
สำหรับสถิติและการวิเคราะห์ดูที่troyhunt.com/2011/06/brief-sony-password-analysis.html - ขณะที่ 36% ของผู้ใช้เลือกรหัสผ่านที่ปรากฏในพจนานุกรมรหัสผ่านมีเพียง 2-3% เท่านั้นที่เลือกรหัสที่พบบ่อยที่สุด
jammycakes

7

คำอธิบายของคุณฟังดูถูกต้องสำหรับสถานะปัจจุบันของศิลปะ

คุณไม่ควรใช้ฟังก์ชั่นแฮชซ้ำ ๆ แม้แต่ครั้งเดียว: อย่างน้อยที่สุดคุณควรวนซ้ำหลายครั้ง (แฮ็คซ้ำ 1,000 ครั้งเพิ่มการทำงานของผู้โจมตี 1000 เท่ามันเพิ่มงานของคุณในปริมาณเดียวกัน แต่ คุณใช้การแฮ็กรหัสผ่านน้อยกว่ามาก)

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


การพูดซ้ำหลายพันครั้งไม่เป็นความคิดที่ดีอย่างที่คุณคิด เพิ่มความเสี่ยงของการชนกันของแฮช yorickpeterse.com/articles/use-bcrypt-fool
jammycakes

1
บทความนั้นดูสับสนอย่างละเอียด ฟังก์ชั่นการแฮ็กที่มีความปลอดภัยจะไม่สูญเสียเอนโทรปีที่ประเมินค่าได้จากการทำซ้ำแบบซ้ำ ๆ และการแฮชแบบวนซ้ำเป็นองค์ประกอบหลักของแผนการยืดคีย์เช่น PBKDF2 และ scrypt แม้แต่ bcrypt ซึ่งผู้เขียนแนะนำก็ใช้โครงสร้างที่คล้ายกัน 'การโจมตี' ของเขาขึ้นอยู่กับการค้นหาแฮช - ในกรณีนี้สิ่งก่อสร้างส่วนใหญ่ที่ใช้แฮชนั้นจะถูกทำลายอย่างละเอียด ในที่สุดฉันไม่แนะนำให้คนใช้ hashing ซ้ำแล้วซ้ำอีกโดยตรง - ในขณะที่ฉันพูดในคำถามของฉันคุณควรใช้ดั้งเดิมที่มีอยู่ที่ออกแบบมาเพื่อวัตถุประสงค์
Nick Johnson

7

SHA1 เป็นข้อความสรุปมันไม่ได้หมายถึงฟังก์ชั่นการแฮ็นรหัสผ่าน (หรือการสืบทอดคีย์) (แม้ว่าจะสามารถใช้ Building Block สำหรับ KDF ได้เช่นใน PBKDF2 พร้อม HMAC-SHA1)

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

ปัจจุบันเลือกที่ดีที่สุดน่าจะเป็นArgon2 ฟังก์ชันการแฮ็กรหัสผ่านในตระกูลนี้ชนะการแข่งขันการแฮ็กรหัสผ่านในปี 2558

หากArgon2ไม่สามารถใช้งานได้ฟังก์ชั่นเฉพาะรหัสผ่านการแฮ็ชหรือรหัสผ่านมาตรฐานอื่น ๆ คือPBKDF2ซึ่งเป็นมาตรฐาน NIST แบบเก่า ตัวเลือกอื่น ๆ ถ้าใช้มาตรฐานไม่จำเป็นต้องรวมbcryptและScrypt

Wikipedia มีหน้าสำหรับฟังก์ชั่นเหล่านี้:


4

พบช่องโหว่ที่ร้ายแรงใน SHA-1 ที่ทำให้การค้นหาเร็วกว่าการใช้กำลังอย่างดุร้าย มันยังคงรักษาไม่ได้ส่วนใหญ่ แต่ไม่คาดว่าจะเป็นเช่นนั้นนานเกินไป โปรแกรมเมอร์หวาดระแวงชอบอะไรบางอย่างจากตระกูล SHA-2

จาก บทความนี้เกี่ยวกับผลลัพธ์ต้นฉบับปี 2005:

"ถึงเวลาเดิน แต่ไม่หนีไปที่กองไฟคุณไม่เห็นควัน แต่สัญญาณเตือนไฟไหม้ดับแล้ว"

ไม่ใช่ว่าการเข้ารหัสลับในปัจจุบันทำให้ SHA-1 ไม่ปลอดภัย แต่ค่อนข้างจะเป็นที่ชุมชนของการเข้ารหัสลับเป็นห่วงว่าข่าวที่เลวร้ายยิ่งอาจจะอยู่ใกล้ ๆ ความกลัวนี้นำไปใช้กับ SHA-2 ซึ่งแสดงข้อบกพร่องเช่นเดียวกับ SHA-1 แม้ว่าจะมีพื้นที่การค้นหาที่กว้างกว่า SHA-3

ในระยะสั้น SHA-1 มีความปลอดภัยในขณะนี้และอาจจะมีบางเวลาที่จะมา แต่ชุมชน crypto ไม่สบายใจกับการพยากรณ์โรค


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

ฉันยังสงสัยในบางสิ่งบางอย่างที่มาจาก NSA เนื่องจากข่าวล่าสุด :)
อเล็กซ์ W

4

ตั้งแต่เดือนกุมภาพันธ์ 2017 SHA-1 ไม่ควรได้รับการพิจารณาว่าปลอดภัยอีกต่อไป Google ได้รายงานความสำเร็จด้วยการโจมตีการชนกับ SHA-1 แบบเต็มและไม่ลดรอบ ( ลิงก์ไปยังรายงาน ) สำหรับการประกาศของ Google คลิกที่นี่คลิกที่นี่

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


โอเคการค้นพบการชน SHA-1 ใช้เวลาประมาณ6,500 CPU ปีและ 100 GPU ปีไม่ใช่การโจมตีจากการผลิต การแคร็กรหัสผ่านไม่ได้เป็นการดุร้ายกับอินพุตที่เป็นไปได้ทั้งหมด แต่เทียบกับรายการรหัสผ่านบ่อย 10,000,000 รายการ นี่คือกระดาษ
zaph

1
ข้อบกพร่องใช้ฟังก์ชันแฮชเพื่อป้องกันรหัสผ่านเท่านั้น เพียงแค่ใช้ฟังก์ชั่นแฮชไม่เพียงพอและเพียงแค่เพิ่มเกลือก็ช่วยเพิ่มความปลอดภัยได้เพียงเล็กน้อยแฮชเข้ารหัสนั้นรวดเร็วมาก แทนที่จะทำซ้ำ HMAC ด้วยเกลือแบบสุ่มเป็นเวลาประมาณ 100ms และบันทึกเกลือด้วยแฮช การใช้งานฟังก์ชั่นเช่นPBKDF2(aka Rfc2898DeriveBytes) password_hash/ password_verify, Bcryptและฟังก์ชั่นที่คล้ายกัน จุดประสงค์คือเพื่อให้ผู้โจมตีใช้เวลานานในการค้นหารหัสผ่านด้วยกำลังดุร้าย การปกป้องผู้ใช้ของคุณเป็นสิ่งสำคัญโปรดใช้วิธีการรหัสผ่านที่ปลอดภัย
zaph

ไม่ใช่การชนกันของข้อมูลและรหัสผ่านไม่ใช่ลายเซ็น การชนกันของข้อมูลนั้นไม่สามารถใช้กับรหัสผ่านได้เนื่องจากพวกเขาต้องการความรู้เกี่ยวกับข้อความธรรมดา
Tgr

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

3

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

นี่คือสิ่งที่ NIST พูดว่า :

ผลลัพธ์ที่นำเสนอใน SHA-1 ไม่ได้เรียกความปลอดภัยเป็นคำถาม อย่างไรก็ตามเนื่องจากความก้าวหน้าทางเทคโนโลยี NIST วางแผนที่จะยกเลิก SHA-1 เพื่อสนับสนุนฟังก์ชันแฮชที่มีขนาดใหญ่ขึ้นและแข็งแรงขึ้น (SHA-224, SHA-256, SHA-256, SHA-384 และ SHA-512) ภายในปี 2010


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