Hash คืออะไร
Hash (แฮช) เป็นฟังก์ชันทางคณิตศาสตร์ที่ใช้สำหรับการแปลงข้อมูลจากรูปแบบของข้อความหรือข้อมูลใดๆ เป็นสตริงของตัวเลขความยาวคงที่ที่เรียกว่า “ค่าแฮช” หรือ “โค้ดแฮช” (hash code) ฟังก์ชันแฮชจะรับข้อมูลใดๆ เข้ามาและสร้างค่าแฮชตามหลักการที่ถูกกำหนดไว้ ฟังก์ชันแฮชมักถูกใช้ในหลายระบบและแอปพลิเคชันที่ต้องการค้นหาข้อมูลอย่างรวดเร็ว เช่นในฐานข้อมูล, การจัดเก็บข้อมูลในตารางแบบแฮช (hash table), การตรวจสอบความเปลี่ยนแปลงของไฟล์ (checksums), การตรวจสอบความปลอดภัยของรหัส (cryptography), และอื่นๆ อีกมากมาย
Hash function คืออะไร
Hash Function เป็นอัลกอริทึมทางคณิตศาสตร์ที่ใช้ในการแปลงข้อมูลต้นฉบับเป็นรหัสหรือค่าแฮช โดยอาศัยคำนวณทางคณิตศาสตร์แบบเฉพาะเพื่อให้ได้ค่าแฮชที่มีคุณสมบัติเฉพาะ ค่าแฮชที่ได้จากฟังก์ชันแฮชมีความยาวคงที่ไม่ว่าข้อมูลต้นฉบับจะยาวเท่าใด และฟังก์ชันแฮชจะไม่สามารถนำค่าแฮชกลับไปเป็นข้อมูลต้นฉบับได้ (one-way function) นี้ช่วยให้ฟังก์ชันแฮชเป็นเครื่องมือสำคัญในความปลอดภัยข้อมูลและการตรวจสอบความถูกต้องของข้อมูล.
ปัจจุบันมีหลายอัลกอริทึมของฟังก์ชันแฮชที่ใช้งานอย่างแพร่หลาย เช่น MD5, SHA-1, SHA-256, SHA-512, และ CRC32 แต่อย่างไรก็ตามควรระวังว่าไม่ใช่ทุกฟังก์ชันแฮชที่มีความปลอดภัยเท่ากัน บางฟังก์ชันอาจมีช่องโหว่ความปลอดภัย หรือถูกทำลายได้ง่าย เพราะฉะนั้นควรเลือกใช้ฟังก์ชันแฮชที่เหมาะสมกับการใช้งานและมีความปลอดภัยในระดับที่เหมาะสม โดยเฉพาะในแอปพลิเคชันที่เกี่ยวข้องกับความปลอดภัยข้อมูลและการรักษาความลับ
Hash function มีกี่รูปแบบ
การเลือกใช้ฟังก์ชันแฮชที่เหมาะสมขึ้นอยู่กับความต้องการของแอปพลิเคชันและระดับความปลอดภัยที่ต้องการ ควรพิจารณาความคงทนและความปลอดภัยของแต่ละฟังก์ชันแฮชและทบทวนการใช้งานเป็นระยะ ๆ เนื่องจากการแนะนำและความคงทนของฟังก์ชันแฮชอาจเปลี่ยนแปลงตามการค้นพบช่องโหว่ใหม่ ๆ และการพัฒนาเทคโนโลยีการโจมตีใหม่ ๆ ที่เกิดขึ้น มีหลายฟังก์ชันแฮชที่ใช้ในการเข้ารหัสและสร้างค่าแฮชสำหรับข้อมูล นี่คือบางตัวอย่างของฟังก์ชันแฮชที่ได้รับความนิยม
- MD5 (Message Digest Algorithm 5):
- ขนาดค่าแฮช: 128 bits.
- ลักษณะการทำงาน: MD5 เป็นฟังก์ชันแฮชแบบไม่คงทนต่อการโจมตี เมื่อให้ข้อมูลเข้ามา, มันจะสร้างค่าแฮชความยาว 128 bits จากข้อมูลนั้น. อัลกอริทึมนี้ทำงานโดยการแบ่งข้อมูลออกเป็นบล็อกขนาดเท่า ๆ กันและประมวลผลแต่ละบล็อกเป็นลำดับ.
- ความคงทนและความปลอดภัย: MD5 ไม่คงทนต่อการโจมตีและมีความปลอดภัยต่ำ มีช่องโหว่ที่ทำให้เป็นไปได้ที่จะสร้างค่าแฮชที่เหมือนกันจากข้อมูลที่แตกต่างกัน.
- SHA-1 (Secure Hash Algorithm 1):
- ขนาดค่าแฮช: 160 bits.
- ลักษณะการทำงาน: SHA-1 เหมือนกับ MD5 แต่มีขนาดค่าแฮชที่ใหญ่ขึ้น และมีการปรับปรุงความคงทนต่อการโจมตีบางประเภท.
- ความคงทนและความปลอดภัย: SHA-1 กำลังจะถูกถือว่าไม่คงทนต่อการโจมตีและไม่ควรใช้ในการป้องกันความปลอดภัยสูง เนื่องจากมีช่องโหว่ที่เกี่ยวข้องกับการแตกคีย์.
- SHA-256 (Secure Hash Algorithm 256-bit):
- ขนาดค่าแฮช: 256 bits.
- ลักษณะการทำงาน: SHA-256 เป็นฟังก์ชันแฮชที่ใช้กันอย่างกว้างขวางในการรักษาความปลอดภัยและความคงทนต่อการโจมตี มันทำงานโดยการแบ่งข้อมูลออกเป็นบล็อกขนาดเท่า ๆ กันและประมวลผลแต่ละบล็อกเป็นลำดับ.
- ความคงทนและความปลอดภัย: SHA-256 มีความคงทนต่อการโจมตีสูงและใช้ในการรักษาความลับและความปลอดภัยข้อมูล.
- SHA-512 (Secure Hash Algorithm 512-bit):
- ขนาดค่าแฮช: 512 bits.
- ลักษณะการทำงาน: SHA-512 เหมือนกับ SHA-256 แต่มีขนาดค่าแฮชที่ใหญ่ขึ้น และมีความคงทนและความปลอดภัยสูง.
- ความคงทนและความปลอดภัย: SHA-512 มีความคงทนต่อการโจมตีสูงและเป็นหนึ่งในฟังก์ชันแฮชที่แข็งแกร่งที่สุดในตระกูล SHA.
- CRC32 (Cyclic Redundancy Check 32-bit):
- ขนาดค่าแฮช: 32 bits.
- ลักษณะการทำงาน: CRC32 ไม่ได้ถูกออกแบบมาเพื่อความปลอดภัย แต่ใช้ในการตรวจสอบความถูกต้องของข้อมูลโดยการสร้างค่าความสอดคล้องที่ใช้ในการตรวจสอบข้อมูล.
- ความคงทนและความปลอดภัย: CRC32 ไม่คงทนต่อการโจมตีและไม่เหมาะสำหรับการใช้ในการรักษาความปลอดภัยข้อมูล.
Hash function คุณสมบัติเป็นอย่างไร
Hash function มีคุณสมบัติหลายอย่างที่ทำให้มันเหมาะสำหรับการใช้งานแต่ละประเภท นี่คือคุณสมบัติหลักของฟังก์ชันแฮช
- ความคงทน (Pre-image Resistance): ความคงทนหมายถึงความยากต่อการหาข้อมูลต้นฉบับ (input) จากค่าแฮช (output) ของฟังก์ชันแฮช ฟังก์ชันแฮชที่มีความคงทนสูงคือที่ไม่สามารถกลับไปหาข้อมูลต้นฉบับได้ง่าย ๆ หรือในคำอื่นคือความยากของการแก้ประโยคแฮช.
- ความคงทนต่อการชนแฮช (Second Pre-image Resistance): ความคงทนต่อการชนแฮชหมายถึงความยากต่อการหาข้อมูลที่มีค่าแฮชเท่ากับค่าแฮชของข้อมูลอื่น ๆ (collision) โดยเฉพาะการหาข้อมูลที่มีค่าแฮชตรงกันกับข้อมูลต้นฉบับที่กำหนด.
- ความคงทนต่อการชนแฮชบท (Collision Resistance): ความคงทนต่อการชนแฮชบทหมายถึงความยากต่อการหาคู่ข้อมูลที่มีค่าแฮชเหมือนกัน นั่นหมายความว่าการที่ค่าแฮชจะซ้ำกันคือเหตุการณ์ที่สุ่มและยากมาก.
- ความคงทนต่อการชนแฮชบทแบบแรง (Avalanche Effect): ความคงทนต่อการชนแฮชบทแบบแรงหมายถึงความสามารถของฟังก์ชันแฮชที่การเปลี่ยนแปลงเพียงบิตเดียวในข้อมูลต้นฉบับจะทำให้ค่าแฮชเปลี่ยนแปลงอย่างสมบูรณ์ ในคำอื่นคือการเปลี่ยนแปลงเล็กน้อยในข้อมูลต้นฉบับควรส่งผลให้ค่าแฮชเปลี่ยนไปอย่างสุ่มและไม่อาจคาดเดาได้.
- ความคงทนต่อการทำแก้ไขข้อมูล (Resistant to Input Changes): ความคงทนต่อการทำแก้ไขข้อมูลหมายถึงความสามารถของฟังก์ชันแฮชที่การเปลี่ยนแปลงเพียงบางส่วนของข้อมูลต้นฉบับจะทำให้ค่าแฮชต่างจากค่าแฮชของข้อมูลต้นฉบับ นี่เป็นคุณสมบัติที่สำคัญในการปกป้องความปลอดภัยของข้อมูล.
- ความคงทนต่อการบุคคลที่สาม (Resistant to Third-Party Attacks): ความคงทนต่อการบุคคลที่สามหมายถึงความยากต่อการโจมตีจากบุคคลที่ไม่ได้มีสิทธิ์เข้าถึงรหัสแหล่งต้นฉบับ ฟังก์ชันแฮชควรป้องกันการโจมตีจากผู้ที่พยายามสร้างค่าแฮชเทียบเท่ากับค่าแฮชของข้อมูลโดยไม่มีข้อมูลต้นฉบับ.
- ความเร็วและประสิทธิภาพ (Efficiency): ฟังก์ชันแฮชควรทำงานอย่างมีประสิทธิภาพเพื่อให้สามารถใช้งานได้ในแอปพลิเคชันที่ต้องการความเร็ว ควรมีการคำนวณที่รวดเร็วและใช้ทรัพยากรน้อย.
- ความคุ้มครองข้อมูล (Data Integrity): ฟังก์ชันแฮชควรรักษาความคุ้มครองข้อมูลโดยไม่ให้มีการเปลี่ยนแปลงค่าแฮชเมื่อข้อมูลไม่เปลี่ยนแปลง นี้เป็นคุณสมบัติสำคัญในการป้องกันการแก้ไขข้อมูลโดยไม่ได้รับอนุญาต.
รหัสของ Hash จะมีกี่ตัวอักษร
ความยาวของรหัส Hash จะขึ้นอยู่กับอัลกอริทึมและการกำหนดค่าที่ใช้ในการสร้าง Hash นั่นเอง แต่ส่วนใหญ่รหัส Hash มักจะมีความยาวในหน่วย bits (บิต) หรือหน่วยตัวอักษรเล็กๆ อย่าง HEX (ฐาน 16) หรือ Base64 (ฐาน 64) ซึ่งใช้เพื่อแสดงค่า Hash ออกมาในรูปแบบที่เราสามารถอ่านและใช้งานได้ง่ายขึ้น.
ตัวอย่าง:
- สำหรับ MD5, SHA-1 และ SHA-256, รหัส Hash มักจะมีความยาวเป็น 32 หลักถ้าเราแสดงในรูปแบบ HEX (ฐาน 16) และมีความยาวเป็น 44 ตัวอักษรถ้าเราแสดงในรูปแบบ Base64.
- สำหรับ SHA-512, รหัส Hash มักจะมีความยาวเป็น 64 หลักถ้าเราแสดงในรูปแบบ HEX (ฐาน 16) และมีความยาวเป็น 88 ตัวอักษรถ้าเราแสดงในรูปแบบ Base64.
กรุณาทราบว่าความยาวของรหัส Hash จะเพิ่มขึ้นเมื่อเราเพิ่มความคงทนและความปลอดภัยของอัลกอริทึมแฮช แต่จำกัดโดยความจำและการแสดงผลอาจทำให้เราแสดงรหัส Hash ในรูปแบบที่ยาวกว่าหรือสั้นกว่ากันได้ตามการใช้งานของแต่ละแอปพลิเคชันและการตั้งค่าของระบบ
Hash มีจุดอ่อนอะไรบ้าง
การเลือกใช้ Hash function และการใช้ค่า Salt (ค่าเพิ่มเติมที่ใช้ในการป้องกันการโจมตี) จะช่วยลดความเสี่ยงของการโจมตีและเพิ่มความปลอดภัยของข้อมู แต่ละฟังก์ชันแฮชมีจุดอ่อนและข้อจำกัดที่ต้องระวังดังนี้
- การโจมตีด้วย Brute-force Attack: การโจมตีโดยใช้ Brute-force attack คือการลองคำทั้งหมดที่เป็นไปได้ที่จะสร้างค่า Hash และเทียบกับค่า Hash ที่เป้าหมาย. หากค่า Hash มีความยาวที่สูงและความซับซ้อน, การโจมตีนี้จะใช้เวลามากขึ้นและยากยิ่งขึ้น. แต่หากค่า Hash มีความยาวและความซับซ้อนต่ำ, การโจมตีโดย Brute-force attack อาจเป็นไปได้ง่ายขึ้น.
- การโจมตีแบบ Dictionary Attack: การโจมตีแบบนี้เป็นการลองคำที่อาจเป็นคำผ่านสำหรับการเข้ารหัส Hash โดยใช้คำที่อยู่ในรายการคำพจนานุกรม (dictionary) หรือคำที่เป็นที่รู้จัก เช่น รหัสผ่านที่ใช้ที่นิยม. การใช้รหัสผ่านที่แข็งแกร่งและที่ไม่เป็นที่รู้จักสามารถป้องกันการโจมตีแบบนี้ได้.
- การโจมตี Rainbow Table: Rainbow table คือตารางที่เก็บคู่ของข้อมูลต้นฉบับและค่า Hash ที่เป็นไปได้ สำหรับการโจมตีแบบ Rainbow table, Hacker สามารถใช้ตารางนี้ในการหาค่า Hash ของข้อมูลต้นฉบับโดยอย่างรวดเร็ว. การใช้ “Salt” สามารถป้องกันการโจมตีแบบนี้ได้.
- การโจมตีแบบ Time-Memory Tradeoff: การโจมตีแบบนี้ใช้ทรัพยากรมาก เช่น หน่วยความจำ ในการสร้างตาราง Rainbow table แต่สามารถทำให้การโจมตีเร็วขึ้น. การใช้ Salt และการทำค่าแฮชยาวขึ้นสามารถลดความเสี่ยงจากการโจมตีนี้.
- การโจมตีแบบ Collision Attack: การโจมตีแบบนี้เกิดขึ้นเมื่อสองข้อมูลต่าง ๆ มีค่า Hash ที่เหมือนกัน ซึ่งสามารถใช้ในการโจมตีและสร้างข้อมูลที่มีค่า Hash ตรงกัน (collision) การใช้ฟังก์ชันแฮชที่คงทนต่อการชนแฮชเป็นสิ่งสำคัญในการป้องกันการโจมตีนี้.
เสริมความแข็งแกร่งของ Hash function ด้วย Salt
การเพิ่มความแข็งแกร่งให้กับการใช้ Hash function สามารถทำได้โดยการเสริมด้วย Saltโดย Salt เป็นข้อมูลสุ่มที่ถูกเพิ่มเข้าไปในข้อมูลต้นฉบับก่อนที่จะถูก Hash ซึ่งทำให้ค่า Hash ผลลัพธ์มีความแปรปรวนและความคงทนต่อการโจมตีดีขึ้น. นี่คือวิธีที่ Salt ช่วยเสริมความแข็งแกร่งของการใช้ Hash:
- การสร้าง Salt: Salt ควรเป็นข้อมูลสุ่มที่ไม่ซ้ำกันสำหรับแต่ละข้อมูลต้นฉบับ. Salt สามารถสร้างขึ้นโดยใช้การสร้างเลขสุ่ม (random number) หรือข้อมูลสุ่มอื่น ๆ ที่มีความคล้ายคลึงกับข้อมูลต้นฉบับ.
- การเชื่อมต่อ Salt กับข้อมูลต้นฉบับ: Salt จะถูกเชื่อมต่อ (concatenated) หรือผสมร่วมกับข้อมูลต้นฉบับก่อนที่จะถูก Hash. ยกตัวอย่างเช่น หากคุณมีรหัสผ่าน “mypassword” และ Salt เป็น “abc123” คุณจะเชื่อมต่อ Salt กับรหัสผ่านเพื่อสร้างข้อมูลต้นฉบับแบบมี Salt เช่น “mypasswordabc123”.
- การ Hash ข้อมูลต้นฉบับแบบมี Salt: ข้อมูลต้นฉบับที่มี Salt จะถูก Hash เหมือนเดิม แต่อีกครั้งค่า Hash จะถูกเพิ่มความสับสนและความคาดเดายากขึ้น.
- การเก็บ Salt: Salt จะถูกเก็บไว้รวมกับค่า Hash ที่ได้ ซึ่งเป็นข้อมูลที่จำเป็นในการตรวจสอบรหัสผ่านในอนาคต.
การใช้ Salt ช่วยป้องกันการโจมตีแบบ Rainbow table และทำให้การคาดเดาค่า Hash ของข้อมูลต้นฉบับมีความยากลำบากมากขึ้น เมื่อ Salt ถูกเพิ่มเข้าไปในกระบวนการ Hashing แม้คุณจะใช้รหัสผ่านที่ซ้ำกันก็จะได้ค่า Hash ที่แตกต่างกันแบบสมบูรณ์ โดยทำให้การบุกรุกด้วยการใช้ข้อมูลรหัสผ่านที่ถูกโจมตีด้วย Rainbow table เป็นไปได้ยากมากขึ้น.