ไม่มันเป็นไปไม่ได้ที่จะย้อนกลับฟังก์ชั่นแฮชเช่น MD5: เนื่องจากค่าแฮชเอาท์พุทเป็นไปไม่ได้ที่จะหาข้อความอินพุตเว้นแต่ว่ามีข้อมูลเกี่ยวกับข้อความอินพุตมากพอ
การถอดรหัสไม่ใช่ฟังก์ชันที่กำหนดไว้สำหรับฟังก์ชันแฮช การเข้ารหัสและถอดรหัสเป็นหน้าที่ของตัวเลขเช่น AES ในโหมด CBC ฟังก์ชันแฮชไม่ได้เข้ารหัสหรือถอดรหัส ฟังก์ชันแฮชใช้เพื่อแยกย่อยข้อความอินพุต เป็นชื่อที่มีความหมายไม่มีขั้นตอนวิธีการย้อนกลับไปได้โดยการออกแบบ
MD5 ได้รับการออกแบบให้เป็นฟังก์ชันแฮชแบบทางเดียวที่มีความปลอดภัย ตอนนี้มันง่ายต่อการสร้างการชนสำหรับ MD5 แม้ว่าส่วนใหญ่ของข้อความอินพุตจะถูกกำหนดล่วงหน้า ดังนั้น MD5 จึงถูกทำลายอย่างเป็นทางการและ MD5 ไม่ควรถูกพิจารณาว่าเป็นแฮชที่มีการเข้ารหัสแบบเข้ารหัสอีกต่อไป อย่างไรก็ตามยังคงเป็นไปไม่ได้ที่จะหาข้อความอินพุตที่นำไปสู่ค่าแฮช: find X เมื่อทราบเฉพาะ H (X) (และ X ไม่มีโครงสร้างที่คำนวณล่วงหน้าด้วยบล็อกอย่างน้อย 128 ไบต์ของข้อมูลที่คำนวณไว้ล่วงหน้า) . มีใครรู้ว่าการโจมตีก่อนภาพกับ MD5
โดยทั่วไปแล้วมันเป็นไปได้ที่จะเดารหัสผ่านโดยใช้กำลังดุร้ายหรือ (เพิ่มเติม) การโจมตีพจนานุกรมเพื่อเปรียบเทียบฐานข้อมูลหรือลองค้นหาแฮชรหัสผ่านในตารางสายรุ้งที่เรียกว่า หากพบการแข่งขันจะต้องมีการคำนวณที่แน่นอนว่ามีการป้อนข้อมูลพบ ฟังก์ชั่นแฮนอกจากนี้ยังมีการรักษาความปลอดภัยจากการโจมตีชน: การค้นหาX'
เพื่อให้ได้รับH(X') = H(X)
H(X)
ดังนั้นหากX
พบว่ามันเป็นคอมพิวเตอร์บางอย่างแน่นอนว่ามันเป็นข้อความอินพุต มิฉะนั้นคุณอาจทำการโจมตีการชนกันทั้งหมด สามารถใช้ตาราง Rainbow เพื่อเพิ่มความเร็วในการโจมตีและมีแหล่งข้อมูลทางอินเทอร์เน็ตเฉพาะที่จะช่วยให้คุณค้นหารหัสผ่านที่มีแฮชที่เฉพาะเจาะจง
เป็นไปได้ที่จะใช้ค่าแฮชอีกครั้งH(X)
เพื่อตรวจสอบรหัสผ่านที่สร้างขึ้นในระบบอื่น สิ่งเดียวที่ระบบรับต้องทำคือการจัดเก็บผลลัพธ์ของฟังก์ชั่นกำหนดค่าF
ที่ใช้H(X)
เป็นอินพุต เมื่อX
มอบให้กับระบบแล้วH(X)
จึงF
สามารถคำนวณใหม่ได้และสามารถเปรียบเทียบผลลัพธ์ได้ กล่าวอีกนัยหนึ่งไม่จำเป็นต้องถอดรหัสค่าแฮชเพื่อยืนยันว่ารหัสผ่านนั้นถูกต้องและคุณยังสามารถเก็บแฮชเป็นค่าอื่นได้
แทนที่จะเป็น MD5 สิ่งสำคัญคือต้องใช้รหัสผ่านแฮชหรือ PBKDF (ฟังก์ชั่นการรับรหัสผ่านที่ใช้รหัสผ่าน) แทน ฟังก์ชั่นดังกล่าวระบุวิธีใช้เกลือพร้อมกับแฮช ด้วยวิธีนี้จะไม่สร้างแฮชที่เหมือนกันสำหรับรหัสผ่านที่เหมือนกัน (จากผู้ใช้รายอื่นหรือภายในฐานข้อมูลอื่น) การแฮ็กรหัสผ่านด้วยเหตุนี้จึงไม่อนุญาตให้ใช้เรนโบว์เทเบิลตราบเท่าที่เกลือมีขนาดใหญ่พอและสุ่มตัวอย่างอย่างเหมาะสม
แฮชรหัสผ่านยังมีปัจจัยการทำงาน (บางครั้งกำหนดค่าโดยใช้การนับซ้ำ ) ที่สามารถชะลอการโจมตีได้อย่างมีนัยสำคัญซึ่งพยายามค้นหารหัสผ่านที่กำหนดค่าเกลือและแฮช นี่เป็นสิ่งสำคัญเนื่องจากฐานข้อมูลที่มีเกลือและค่าแฮชอาจถูกขโมยได้ ในที่สุดแฮรหัสผ่านอาจจะยากสำหรับหน่วยความจำเพื่อที่จะต้องใช้หน่วยความจำจำนวนมากในการคำนวณการแฮช สิ่งนี้ทำให้ไม่สามารถใช้ฮาร์ดแวร์พิเศษ (GPU, ASIC, FPGA และอื่น ๆ ) เพื่อให้ผู้โจมตีสามารถเพิ่มความเร็วในการค้นหา อินพุตหรือตัวเลือกการกำหนดค่าอื่น ๆ เช่นพริกไทยหรือจำนวนของการขนานอาจมีให้สำหรับแฮรหัสผ่าน
อย่างไรก็ตามจะยังคงอนุญาตให้ใครก็ตามยืนยันรหัสผ่านที่กำหนดH(X)
แม้ว่าH(X)
จะเป็นรหัสผ่านแฮช แฮชรหัสผ่านยังคงกำหนดไว้ดังนั้นหากใครรู้อินพุตทั้งหมดและอัลกอริธึมแฮชX
สามารถใช้ในการคำนวณH(X)
และ - อีกครั้ง - ผลลัพธ์สามารถเปรียบเทียบได้
ปกติ hashes รหัสผ่านที่ใช้เป็นbcrypt , ScryptและPBKDF2 นอกจากนี้ยังมีArgon2ในรูปแบบต่าง ๆ ซึ่งเป็นผู้ชนะการแข่งขันแฮ็ครหัสผ่านที่สมเหตุสมผลล่าสุด ที่นี่ใน CrackStationเป็นการโพสต์บล็อกที่ดีเกี่ยวกับการรักษาความปลอดภัยรหัสผ่านที่ถูกต้อง
เป็นไปได้ที่จะทำให้คู่ต่อสู้ทำการคำนวณแฮชไม่สามารถตรวจสอบได้ว่ารหัสผ่านนั้นถูกต้อง สำหรับสิ่งนี้พริกไทยสามารถใช้เป็นอินพุตเพื่อแฮรหัสผ่าน หรืออีกวิธีหนึ่งค่าแฮชสามารถเข้ารหัสได้โดยใช้รหัสเช่น AES และโหมดการทำงานเช่น CBC หรือ GCM อย่างไรก็ตามต้องมีการจัดเก็บข้อมูลลับ / คีย์อย่างอิสระและมีข้อกำหนดการเข้าถึงที่สูงกว่าการแฮรหัสผ่าน