อักษรไทยไม่มีตัวพิมพ์ใหญ่-เล็กและไม่เว้นวรรคระหว่างคำ แต่มีความซับซ้อนอีกแบบคือสระและวรรณยุกต์ที่วางซ้อนอยู่เหนือหรือใต้พยัญชนะ ในการเข้ารหัส Unicode ลำดับของสระบน วรรณยุกต์ และตัวการันต์ในบางกรณีมีความยืดหยุ่น ทำให้ข้อความที่หน้าตาเหมือนกันทุกประการบนหน้าจออาจมีลำดับไบต์ภายในต่างกันได้ — และนั่นหมายถึงแฮชที่ต่างกันสำหรับข้อความที่ "ดูเหมือนกัน"
ทำไมเรื่องนี้ถึงน่าประหลาดใจเมื่อแฮชข้อความภาษาไทย
ตัวอัลกอริทึมแฮชเองทำงานถูกต้องเสมอ — มันแค่เห็นไบต์ที่ต่างกันแล้วให้ผลลัพธ์ที่ต่างกันตามนั้น ปัญหาจริง ๆ อยู่ที่ขั้นตอนก่อนหน้า: เมื่อต้องเปรียบเทียบหรือแฮชข้อความภาษาไทยที่มาจากหลายแหล่ง (คัดลอกจากเว็บ จากแอป จากไฟล์เอกสาร) ควรทำ Unicode normalization ให้เป็นรูปแบบเดียวกันก่อน ไม่เช่นนั้นข้อความที่เหมือนกันทุกประการอาจถูกมองว่า "ต่างกัน" เพียงเพราะการเข้ารหัสภายในต่างกัน
เหตุใด MD5 และ SHA-1 จึงถือว่าไม่ปลอดภัย
สำหรับทั้งสองอัลกอริทึม มีการค้นพบวิธีที่ใช้งานได้จริงในการสร้างชุดข้อมูลสองชุดที่ต่างกันแต่มีแฮชเดียวกัน — เรียกว่าการชนกัน (collision) สิ่งนี้ทำให้ไม่เหมาะกับที่ที่ความแข็งแกร่งทางการเข้ารหัสสำคัญ แม้จะยังใช้ในที่ที่ต้องการแค่การตรวจสอบความถูกต้องอย่างรวดเร็ว
SHA-256 และตระกูล SHA-2
SHA-256 สร้างแฮชขนาด 256 บิต และจนถึงปัจจุบันยังไม่มีการชนกันที่ใช้งานได้จริงที่รู้จัก ใช้ในบล็อกเชน ใบรับรอง TLS และการตรวจสอบความถูกต้องของซอฟต์แวร์
ทำไมต้องใช้สิ่งนี้
- ตรวจสอบความถูกต้องของไฟล์ที่ดาวน์โหลดโดยเปรียบเทียบกับแฮชที่เผยแพร่
- เข้าใจว่าทำไมข้อความภาษาไทยที่ "เหมือนกัน" จากสองแหล่งอาจให้แฮชต่างกัน
- สร้างลายนิ้วมือสั้น ๆ ที่ไม่ซ้ำกันสำหรับข้อมูลจำนวนมาก
เหตุใด SHA-3 จึงไม่ได้มาแทนที่ SHA-2
SHA-3 ถูกเลือกให้เป็นผู้ชนะการแข่งขันแยกต่างหากของ NIST เผื่อกรณีที่ในอนาคตพบช่องโหว่พื้นฐานใน SHA-2 — มันคือ "ประกันภัย" ที่อิงโครงสร้างภายในที่แตกต่างไปโดยพื้นฐาน (Keccak) เนื่องจากยังไม่พบการโจมตีเชิงปฏิบัติต่อ SHA-2 SHA-256 จึงยังคงเป็นค่ามาตรฐานเริ่มต้นในระบบส่วนใหญ่