แฮช "ที่ปลอดภัย" คือแฮที่เชื่อกันว่าเป็นการ "หลอก" ในลักษณะที่เป็นสูตรและทำซ้ำได้โดยไม่ต้องมีความรู้มาก่อนเกี่ยวกับข้อความที่ใช้สร้างแฮช โดยทั่วไปข้อมูลนั้นเป็นความลับดังนั้นความต้องการแฮชจึงเป็นคุณสมบัติที่ดีของฟังก์ชั่นการแฮชที่มีไว้สำหรับใช้ในการตรวจสอบความถูกต้อง
โดยทั่วไปแล้วแฮ็กจะถือว่า "ปลอดภัย" หากได้รับข้อความ M, ฟังก์ชันแฮช () และค่าแฮชที่ผลิตโดยแฮช (M) ที่มีความยาวเป็นบิต L ไม่มีสิ่งใดต่อไปนี้ที่สามารถทำได้ในน้อยกว่าเวลา O (2 L ):
- ได้รับ hash () และ H สร้าง M (ต้านทานแบบ preimage)
- ได้รับ hash () และ M ทำให้เกิด M 2 ที่ต่างกันเช่น hash (M 2 ) == H (ความต้านทานการชนที่อ่อนแอ)
- ได้รับ hash () ผลิต M 1และ M 2 แบบใดก็ได้ที่ hash (M 1 ) == hash (M 2 ) (ความต้านทานการชนที่แข็งแกร่ง)
นอกจากนี้แฮชที่ "ปลอดภัย" จะต้องมีแฮชที่มีความยาว L ซึ่งเท่ากับ 2 Lไม่ใช่จำนวนขั้นตอนที่เป็นไปได้สำหรับคอมพิวเตอร์ที่จะดำเนินการกับฮาร์ดแวร์ปัจจุบันที่กำหนด แฮชจำนวนเต็มแบบ 32 บิตสามารถมีค่าได้ 2.1 พันล้านเท่านั้น ในขณะที่การโจมตี preimage (การค้นหาข้อความที่สร้างแฮช H) จะใช้เวลาสักครู่ แต่ก็ไม่สามารถทำได้สำหรับคอมพิวเตอร์หลาย ๆ เครื่องโดยเฉพาะอย่างยิ่งผู้ที่อยู่ในมือของหน่วยงานรัฐบาลที่ได้รับอนุญาตให้ใช้รหัสผิดพลาด นอกจากนี้อัลกอริทึมที่สร้างและจัดเก็บข้อความแบบสุ่มและแฮชของพวกเขาจะมีช็อต 50% ในการค้นหาแฮชซ้ำกับแต่ละข้อความใหม่หลังจากลองเพียง 77,000 ข้อความและจะมีโอกาส 75% ที่จะตี ซ้ำหลังจาก 110,000 เท่านั้น แม้แฮชแบบ 64 บิตยังคงมีโอกาส 50% ที่จะชนกันหลังจากลองใช้ค่าประมาณ 5 พันล้านเท่านั้น นั่นคือพลังของการโจมตีวันเกิดจากแฮชขนาดเล็ก ตรงกันข้าม,ตัวเลขdecillion (1.5 * 10 34 )
การโจมตีส่วนใหญ่ที่แสดงถึงการเข้ารหัสลับนั้นเป็นการโจมตีแบบชนกันและได้แสดงให้เห็นถึงความสามารถในการสร้างข้อความที่ขัดแย้งกันในเวลาน้อยกว่า 2 L (ส่วนใหญ่ยังคงเป็นแบบ exponential-time แต่การลดเลขชี้กำลังเป็นครึ่ง แฮชแบบ 256 บิตเป็นเรื่องง่ายที่จะแก้ปัญหาเช่นเดียวกับ 128 บิต, 128 บิตเป็นเรื่องง่ายที่จะแก้ปัญหาเช่น 64 บิต ฯลฯ )
นอกเหนือจากขนาดแฮชขนาดเล็กปัจจัยอื่น ๆ ที่สามารถทำให้แฮชที่ไม่ปลอดภัยสามารถพิสูจน์ได้คือ:
งานต่ำ - แฮชที่ออกแบบมาเพื่อใช้งานโดย hashtable หรือสำหรับวัตถุประสงค์อื่น ๆ "เช็คซัม" ประเภทอื่น ๆ มักจะได้รับการออกแบบให้มีราคาไม่แพง นั่นทำให้การโจมตีแบบเดรัจฉานบังคับง่ายกว่ามาก
"Sticky State" - ฟังก์ชั่นการแฮ็ชมีแนวโน้มที่จะมีรูปแบบของอินพุตที่ค่าแฮชปัจจุบันของอินพุตทั้งหมดจนถึงตอนนี้จะไม่เปลี่ยนแปลงเมื่อได้รับไบท์เพิ่มเติมของอินพุต การมี "สถานะติดหนึบ" ทำให้หาเจอได้ง่ายเพราะเมื่อคุณระบุข้อความที่สร้างแฮช "สถานะติดหนึบ" จะไม่สำคัญในการสร้างข้อความอื่น ๆ ที่มีแฮชเดียวกันโดยต่อท้ายอินพุตไบต์ที่ทำให้แฮชอยู่ในสถานะ "ติดหนึบ" "
การกระจาย - แต่ละไบต์อินพุตของข้อความควรแจกจ่ายระหว่างไบต์ของค่าแฮชในวิธีที่ซับซ้อนเท่ากัน ฟังก์ชันแฮชบางอย่างสร้างการเปลี่ยนแปลงที่คาดการณ์ได้สำหรับบิตบางอย่างในแฮช สิ่งนี้ทำให้การสร้างการชนกันเป็นเรื่องเล็กน้อย เมื่อได้รับข้อความที่สร้างแฮชสามารถสร้างการชนได้ง่ายโดยการแนะนำค่าใหม่ให้กับข้อความที่มีผลกับบิตที่เปลี่ยนไปอย่างคาดเดาได้