คู่มือ

อัลกอริทึมการแฮช: คู่มือฉบับสมบูรณ์

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

ฟังก์ชันการแฮชคืออะไร?

ฟังก์ชันการแฮชเป็นอัลกอริทึมทางคณิตศาสตร์ที่แปลงข้อมูลอินพุตที่มีขนาดใดก็ได้เป็นสตริงขนาดคงที่ของไบต์ ผลลัพธ์ที่เรียกว่า "แฮช" หรือ "ไดเจสต์" มีคุณสมบัติหลายประการที่ทำให้มีประโยชน์สำหรับวัตถุประสงค์ด้านความปลอดภัยและการตรวจสอบความสมบูรณ์ คุณสมบัติหลักของฟังก์ชันการแฮชที่ดี: กำหนดได้—อินพุตเดียวกันให้แฮชเดียวกันเสมอ รวดเร็ว—การคำนวณแฮชควรมีประสิทธิภาพ ผลกระทบหิมะถล่ม—การเปลี่ยนแปลงขนาดเล็กในอินพุตเปลี่ยนแฮชอย่างมาก ทิศทางเดียว—แทบเป็นไปไม่ได้ที่จะกลับจากแฮชไปเป็นอินพุต ต้านทานการชน—การหาอินพุตสองตัวที่ให้แฮชเดียวกันควรเป็นไปไม่ได้ในทางปฏิบัติ อัลกอริทึมการแฮชทั่วไป: MD5 (128 บิต)—เร็วแต่เสียหาย ใช้เฉพาะสำหรับการตรวจสอบที่ไม่ใช่ด้านความปลอดภัยเท่านั้น SHA-1 (160 บิต)—เลิกใช้แล้ว หลีกเลี่ยงสำหรับงานใหม่ SHA-256 (256 บิต)—มาตรฐานปัจจุบันสำหรับแอปพลิเคชันส่วนใหญ่ SHA-512 (512 บิต)—ปลอดภัยยิ่งขึ้น ใช้เมื่อต้องการขนาดแฮชที่ใหญ่ขึ้น SHA-3—มาตรฐาน SHA ล่าสุด โครงสร้างภายในที่แตกต่าง สำหรับรหัสผ่าน: ใช้อัลกอริทึมการแฮชรหัสผ่านเฉพาะ (bcrypt, scrypt, Argon2) ไม่ใช่ฟังก์ชันการแฮชทั่วไป ฟังก์ชันการแฮชรหัสผ่านถูกออกแบบมาให้ช้าเพื่อต้านทานการโจมตีแบบ brute-force การแฮชแตกต่างจากการเข้ารหัสลับ: การแฮชเป็นทิศทางเดียว (ไม่สามารถกลับคืน) การเข้ารหัสลับเป็นสองทิศทาง (สามารถถอดรหัสด้วยคีย์)

กรณีการใช้งานทั่วไป

การตรวจสอบความสมบูรณ์ของข้อมูล: ตรวจสอบว่าไฟล์ไม่เปลี่ยนแปลงระหว่างการดาวน์โหลด เว็บไซต์ซอฟต์แวร์ให้เช็คซัม SHA-256 สำหรับการยืนยัน แฮชไฟล์ที่ดาวน์โหลดและเปรียบเทียบ—ถ้าตรงกัน ไฟล์สมบูรณ์ ถ้าแตกต่างกัน ไฟล์เสียหายหรือถูกงัดแงะ การตรวจสอบความถูกต้องของรหัสผ่าน (ด้วย bcrypt/scrypt): อย่าเก็บรหัสผ่านแบบธรรมดา ให้แฮชรหัสผ่านก่อนเก็บ เมื่อผู้ใช้เข้าสู่ระบบ ให้แฮชรหัสผ่านที่ป้อนและเปรียบเทียบกับแฮชที่เก็บไว้ ไม่มีใครรวมทั้งคุณมองเห็นรหัสผ่านจริง ลายเซ็นดิจิทัล: แฮชข้อมูลก่อนแล้วเซ็นแฮช (ไม่ใช่ข้อมูลทั้งหมด) สิ่งนี้มีประสิทธิภาพและรักษาความเป็นส่วนตัว ผู้รับแฮชข้อมูลและตรวจสอบลายเซ็นกับแฮช การจัดเก็บเนื้อหา: Git ใช้แฮช SHA-1 เป็นตัวระบุเนื้อหา การเดดูปลิเคชันข้อมูล: เดดูปลิเคชันไฟล์โดยการแฮชเนื้อหาและจัดเก็บเพียงหนึ่งสำเนาของแฮชที่ไม่ซ้ำกันแต่ละตัว ตารางแฮช: โครงสร้างข้อมูลใช้แฮชสำหรับการค้นหาอย่างรวดเร็ว Blockchain และ cryptocurrency: Bitcoin ใช้การแฮช SHA-256 อย่างกว้างขวาง

ข้อพิจารณาด้านความปลอดภัย

MD5 เสียหาย: ไม่ปลอดภัยทางคริปโตกราฟี การชนสามารถสร้างได้ ใช้เฉพาะสำหรับการตรวจสอบไฟล์ที่ไม่ใช่ด้านความปลอดภัย ไม่เคยใช้สำหรับรหัสผ่านหรือลายเซ็น SHA-1 เลิกใช้แล้ว: Google แสดงให้เห็นการชนจริงในปี 2017 กำลังถูกแทนที่ด้วย SHA-256 ในทุกที่ ใบรับรอง SSL/TLS ไม่ยอมรับ SHA-1 อีกต่อไป SHA-256 เป็นมาตรฐานปัจจุบัน: ปลอดภัยสำหรับแอปพลิเคชันส่วนใหญ่ ใช้สำหรับลายเซ็นดิจิทัล การตรวจสอบไฟล์ cryptocurrency SHA-512 เสนอความปลอดภัยเพิ่มเติมด้วยแฮชที่ยาวกว่า อย่าใช้แฮชทั่วไปสำหรับรหัสผ่าน: SHA-256 เร็วเกินไป—ผู้โจมตีสามารถทดลองพันล้านรหัสผ่านต่อวินาที ใช้ bcrypt, scrypt หรือ Argon2 ซึ่งออกแบบมาให้ช้า ฟังก์ชันเหล่านี้มีการปรับค่าความยากที่คุณเพิ่มเมื่อฮาร์ดแวร์เร็วขึ้น ใช้ salt สำหรับการแฮชรหัสผ่าน: เพิ่มข้อมูลสุ่มก่อนการแฮชเพื่อป้องกันการโจมตีด้วยตารางรุ้ง bcrypt/scrypt/Argon2 จัดการการ salt โดยอัตโนมัติ อย่าสร้างสคีมการ salt ของคุณเอง HMAC สำหรับข้อความที่ตรวจสอบความถูกต้อง: การแฮชธรรมดาไม่ได้ตรวจสอบความถูกต้อง—ผู้โจมตีสามารถแก้ไขข้อมูลและคำนวณแฮชใหม่ HMAC ใช้คีย์ลับกับฟังก์ชันการแฮช ใช้ HMAC-SHA256 สำหรับการตรวจสอบความถูกต้องของข้อความ

ลองใช้เครื่องมือ

สร้างแฮช

สร้างแฮช

เรียนรู้เพิ่มเติม

คำถามที่พบบ่อย

สร้างแฮช

คำถามที่พบบ่อย