คุณควรออกแบบแฮชรหัสผ่านของคุณเอง
การสร้างฟังก์ชันการเข้ารหัสยังคงเป็นกระบวนการลองผิดลองถูกอยู่มาก แน่นอน เมื่อเวลาผ่านไป เราสะดุดกับบางสิ่งที่เป็นความคิดที่ดีหรือแม้กระทั่งเป็นข้อบังคับ และเราได้เรียนรู้หลายสิ่งหลายอย่างอย่างแน่นอน อย่า งาน. แต่เราไม่รู้วิธีสร้างสิ่งที่พิสูจน์แล้วว่าปลอดภัยตลอดทาง ข้อผิดพลาดเล็กน้อยที่ละเอียดอ่อนมากอาจทำให้โครงสร้างการเข้ารหัสล้มเหลวอย่างร้ายแรง และมี มาก ของโอกาสในการผิดพลาดดังกล่าว ฉันจะตั้งชื่อบางอย่างในภายหลัง
สิ่งที่ดีที่สุดที่เราสามารถทำได้ในตอนนี้คือผู้คนที่มีประสบการณ์ในเรื่องนี้สร้างสิ่งเข้ารหัสลับ จากนั้นทุกคนก็พยายามและทำลายสิ่งเข้ารหัสลับนั้น ถ้าทุกคนพยายามมากพอและไม่ประสบความสำเร็จเป็นเวลานาน เราก็มีบางอย่างที่น่าจะดีพอ เรายังไม่สามารถพิสูจน์ได้ว่าไม่มีปัญหา แต่ถ้าการเข้ารหัสลับนับพันไม่สามารถทำได้ หวังว่าพันถัดไปก็ทำไม่ได้เช่นกัน
แต่ถึงแม้จะล้มเหลวเป็นครั้งคราว บางครั้งหลังจากผ่านไปหลายปี หลายสิบปี ปัญหาร้ายแรงก็พบได้ในสิ่งที่คนที่ฉลาดที่สุดพิจารณามาเป็นเวลานาน นั่นคือสาเหตุที่ MD5 ไม่ถือว่าตกลงอีกต่อไป และเหตุใด RC4 จึงถูกพิจารณาว่าเป็นปัญหา หรือภูมิลักษณ์เปลี่ยนไป เป็นต้นว่า ความต้องการเกลือในแฮชรหัสผ่านและฟังก์ชันแฮชที่ช้าโดยเจตนา
ด้วยการใช้อัลกอริทึมการเข้ารหัสที่รู้จักกันดีที่สุดในปัจจุบัน เราสามารถใช้ประโยชน์จากประสบการณ์โดยรวมนี้ และอาจหลีกเลี่ยงข้อผิดพลาดในอดีตซ้ำได้ อาจมีการค้นพบข้อผิดพลาดใหม่ ๆ แต่ก็ไม่สามารถช่วยได้ ผู้ที่สร้างฟังก์ชันการเข้ารหัสลับของตัวเองมีแนวโน้มที่จะทำซ้ำข้อผิดพลาดเหล่านั้นหรือสร้างใหม่ทั้งหมด
ฉันรู้ ฉันรู้ว่ามันสนุกที่ได้ออกแบบสิ่งนั้นด้วยตัวคุณเอง และรู้สึกดีที่จะสร้างสิ่งที่รู้สึกปลอดภัย Stack Exchange เต็มไปด้วยคำถามเกี่ยวกับการเข้ารหัสแบบกำหนดเองและแฮชรหัสผ่าน (โดยเฉพาะ) ปัญหาคือมันง่ายที่จะสร้างสิ่งที่คุณไม่สามารถทำลายได้ แต่ไม่ได้หมายความว่าคนอื่นทำไม่ได้สุภาษิตนี้มีมาแต่โบราณ และเกิดขึ้นบ่อยจนปัจจุบันเรียกว่า กฎของชไนเออร์.
มีอะไรผิดพลาดได้บ้าง?
ดังนั้นจึงอาจมีปัญหากับแกนหลักของอัลกอริทึมการเข้ารหัสลับ นี่คือสิ่งที่ทำให้ MD5 และ RC4 พัง
หรืออัลกอริทึมอาจใช้ได้ดี แต่การใช้งานอาจเสียหายได้ นี่อาจเป็นจุดบกพร่องธรรมดาๆ หรืออาจเป็นจุดบกพร่องที่ละเอียดกว่านั้น เช่น การโจมตีช่องทางด้านข้าง (ซึ่งบางครั้งก็ยากที่จะหลีกเลี่ยง)
แต่ก็เป็นไปได้เช่นกัน (ง่ายเหมือนกัน) สำหรับการเข้ารหัสดั้งเดิมที่ปลอดภัยพร้อมการใช้งานที่ปราศจากข้อผิดพลาดซึ่งจะถูกนำไปใช้อย่างไม่ถูกต้อง ซึ่งทำให้ระบบไม่ปลอดภัย ตัวอย่างเช่น การใช้การเข้ารหัสและลายเซ็นดิจิทัลอย่างถูกต้อง แต่การตั้งสมมติฐานที่ไร้เดียงสาระหว่างการจับมือสื่อสาร (SSL มีปัญหาร่วมกันในเรื่องนี้) อีกตัวอย่างที่รู้จักกันดีคือ เออีเอส-อีซีบีซึ่งใช้ AES ที่สมบูรณ์แบบในลักษณะที่อาจทำให้ข้อมูลสำคัญรั่วไหลได้
ในฟังก์ชันแฮชของคุณ?
ฟังก์ชันการแฮชรหัสผ่านของคุณเองก็ตกเป็นเหยื่อของสิ่งนี้เช่นกัน:
ทำซ้ำ 100_000:
แฮช = sha512 (แฮช)
SHA-512 นั้นใช้ได้อย่างสมบูรณ์แบบ (เท่าที่เรารู้) ใช้แบบนี้ถือว่าพลาด
SHA-512 สร้างเอาต์พุต 512 บิตที่ "แยกแยะไม่ออกจากการสุ่ม" สำหรับทุกอินพุต มันอาจสร้างเอาต์พุตเดียวกันสำหรับสองอินพุตที่แตกต่างกัน ซึ่งเรียกว่าการชนกัน ปัญหาคือโดยทั่วไปแล้วฟังก์ชันแฮช N-บิตบนอินพุต N-บิตไม่ใช่ วัตถุประสงค์. ซึ่งหมายความว่าเมื่อป้อนเอาต์พุต SHA-512 ให้กับตัวมันเอง ค่า 512 บิตที่เป็นไปได้บางค่าจะชนกับค่าอื่น ทำให้เกิดเอาต์พุตเดียวกัน โดย ความจำเป็นซึ่งหมายความว่าไม่สามารถสร้างค่าแฮชอื่นๆ บางค่าได้เลย
ลองดูวิธีการทำงานสำหรับ SHA-512 ที่ตัดเหลือ 4 บิต โดยเฉพาะอย่างยิ่ง เรารับไบต์แรกจากเอาต์พุต และนำ 4 บิตสูงเป็นศูนย์ในไบต์นี้ ไบต์เดียวที่เป็นผลลัพธ์จะถูกใช้เป็นอินพุตสำหรับรอบถัดไป วิธีเลือกบิตต่างกันให้ผลลัพธ์ต่างกัน แต่หลักการเหมือนกัน
การลองอินพุตที่เป็นไปได้ทั้งหมด 16 รายการสำหรับหลายๆ รอบทำให้เรามีห่วงโซ่เหล่านี้:
ใน 1. 2. 3. 4. 5. 6. 7.
00 -> 08 -> 06 -> 08 -> 06 -> 08 -> 06 -> 08
06 -> 08 /
07 -> 06 -> 08 -> 06 -> 08 -> 06 -> 08 -> 06
08 -> 06 /
03 -> 04 -> 05 \
13 -> 15 -> 05 -> 09 -> 02 -> 10 -> 14 -> 14
04 -> 05 -> 09 -> 02 -> 10 -> 14 -> 14 /
15 -> 05 -> 09 -> 02 -> 10 -> 14 /
05 -> 09 -> 02 -> 10 -> 14 -> 14
01 -> 11 -> 02 -> 10 -> 14 /
09 -> 02 -> 10 -> 14 -> 14
11 -> 02 -> 10 -> 14 /
02 -> 10 -> 14 -> 14
12 -> 10 / /
10 -> 14 -> 14
14 -> 14 /
หลังจากผ่านไปเพียง 6 รอบ เอาต์พุตที่เป็นไปได้ 16 รายการได้ลดลงเหลือเพียง 3 เอฟเฟกต์เดียวกันนี้สามารถเห็นได้สำหรับการตัดทอนที่ใหญ่ขึ้น ฉันเรียกใช้การจำลองบางอย่างสำหรับ SHA-512 ที่ตัดทอนเป็น 1 ไบต์แรก (2â¸), 2 ไบต์ (2¹â¶) และ 3 ไบต์ (2²â´):
ไบต์: 1 2 3
ช่องใส่ข้อมูล: 256 65536 16777216
รวมกันเป็นค่า M: 13 330 2765
หลังจาก N รอบ: 31 518 7114
คุณจะเห็นว่าเอฟเฟกต์คอนเวอร์เจนซ์มีอยู่ในทั้งสามสถานการณ์ สำหรับการเจียระไน SHA-512 คอมพิวเตอร์ของฉันไม่เร็วพอที่จะคำนวณสิ่งนี้ ฉันไม่พบข้อมูลใด ๆ เกี่ยวกับความแรงและความแน่นอนของเอฟเฟกต์ และฉันไม่ฉลาดพอที่จะสร้างหลักฐาน (หากการพิสูจน์คือ เป็นไปได้ด้วยซ้ำ) แต่โอกาสที่คุณจะเห็นผลใน SHA-512 เต็มรูปแบบเช่นกัน สัญชาตญาณของฉันสงสัยว่ามันลดพื้นที่แฮชด้วยสแควร์รูท (ลดความยาวบิตลงครึ่งหนึ่ง) แต่ฉันอาจคิดผิดมาก [อัปเดต: ดูลิงก์ที่ให้ไว้ในความคิดเห็น: หนึ่ง, สอง, สาม]. 100,000 รอบอาจจำกัดความเสียหายด้วย
ตอนนี้สิ่งนี้เป็นอันตรายต่อแฮชของคุณหรือไม่? อาจจะไม่. แต่มัน เป็น จุดอ่อนอย่างหนึ่งที่ฟังก์ชันแฮชรหัสผ่านในโลกแห่งความเป็นจริงพยายามหลีกเลี่ยง (เช่น ตรวจสอบว่ารหัสผ่านและเกลือผสมกันเป็นประจำ)
ฉันคิดว่านี่เป็นตัวอย่างที่ดีของกับดักเล็กๆ น้อยๆ ในการออกแบบคริปโต มันง่ายมากที่จะพลาดอะไรแบบนี้ นั่นเป็นเหตุผลที่ฉันแนะนำให้ใช้อัลกอริทึมที่ผ่านการทดสอบการต่อสู้ พวกเขาดีกว่าสิ่งที่คุณหรือฉันจะคิดได้
คำตอบอื่นๆ ได้ให้คำแนะนำเกี่ยวกับแฮชที่จะใช้แล้ว ตกลง: pbkdf2, bcrypt ดีกว่า: argon2, scrypt ฉันได้ยินมาว่าบอลลูนเป็นสิ่งหนึ่ง แต่ฉันไม่รู้อะไรเลยเกี่ยวกับเรื่องนี้ ดังนั้นฉันจึงไม่มีความคิดเห็นเกี่ยวกับเรื่องนี้