Hash คืออะไร และทำไมมันอยู่ทุกที่ในเทคโนโลยี?
คุณอาจเคยเห็นสตริงแบบนี้:
e3b0c44298fc1c149afbf4c8996fb924
27ae41e4649b934ca495991b7852b855
มันปรากฏในการดาวน์โหลดซอฟต์แวร์ ("ตรวจสอบ SHA-256 hash") ในการพูดคุยเรื่อง blockchain ในการอภิปรายเรื่องความปลอดภัยรหัสผ่าน และในเครื่องมือนักพัฒนานับไม่ถ้วน แต่จริงๆ แล้ว hash คืออะไร และทำไมมันถึงเป็นพื้นฐานของเทคโนโลยีสมัยใหม่?
แนวคิดเป็นภาษาง่ายๆ
ฟังก์ชัน hash รับอินพุตใดก็ได้ ไม่ว่าจะเป็นคำ ประโยค หรือไฟล์ทั้งไฟล์ และสร้างผลลัพธ์ที่มีความยาวคงที่เรียกว่า ค่า hash (เรียกอีกอย่างว่า digest, checksum หรือ fingerprint) คุณสมบัติสำคัญคือ:
- กำหนดแน่นอน อินพุตเดียวกันให้ผลลัพธ์เดียวกันเสมอ
- ความยาวคงที่ ไม่ว่าอินพุตจะใหญ่แค่ไหน ผลลัพธ์มีขนาดเท่าเดิมเสมอ
- ทางเดียว คุณไม่สามารถสร้างอินพุตต้นฉบับจากผลลัพธ์ hash ได้
- ผลกระทบหิมะถล่ม การเปลี่ยนแปลงเล็กน้อยในอินพุตสร้าง hash ที่แตกต่างอย่างสิ้นเชิง
คิดว่าเป็นลายนิ้วมือของข้อมูล เช่นเดียวกับที่ลายนิ้วมือระบุตัวคุณได้แต่ไม่สามารถใช้สร้างใบหน้าของคุณ hash ระบุข้อมูลได้แต่ไม่สามารถใช้สร้างข้อมูลต้นฉบับ
ตัวอย่างง่ายๆ
นี่คือสิ่งที่ฟังก์ชัน hash SHA-256 ทำกับอินพุตสองตัวที่คล้ายกันมาก:
| อินพุต | SHA-256 Hash (16 ตัวอักษรแรก) |
|---|---|
| "Hello" | 185f8db32271fe25... |
| "hello" | 2cf24dba5fb0a30e... |
| "hello!" | ce06092fb948d9ff... |
การเปลี่ยนตัวอักษรเดียว (H ตัวใหญ่เป็น h ตัวเล็ก) หรือเพิ่มเครื่องหมายอัศเจรีย์ให้ hash ที่แตกต่างอย่างสิ้นเชิง ไม่มีรูปแบบ ไม่มีความสัมพันธ์ที่คาดเดาได้ นี่คือผลกระทบหิมะถล่มในทางปฏิบัติ
รู้หรือไม่? SHA-256 hash ของอินพุตว่าง (ไม่มีอะไรเลย) คือ e3b0c44298fc1c14... นี่เป็นค่าคงที่ที่รู้จักกันดี ทุก SHA-256 implementation ในโลกสร้างผลลัพธ์เดียวกันนี้สำหรับอินพุตว่าง
อัลกอริทึม Hash ที่พบบ่อย
MD5
- ผลลัพธ์: 128 บิต (32 ตัวอักษรฐานสิบหก)
- สถานะ: ถูกเจาะสำหรับจุดประสงค์ความปลอดภัย Collision (อินพุตต่างกันให้ hash เดียวกัน) สามารถสร้างได้ในไม่กี่วินาที
- ยังใช้สำหรับ: ตรวจสอบความสมบูรณ์ของไฟล์เมื่อความปลอดภัยไม่สำคัญ (เช่น ตรวจสอบว่าการดาวน์โหลดไม่เสียหาย)
SHA-1
- ผลลัพธ์: 160 บิต (40 ตัวอักษรฐานสิบหก)
- สถานะ: เลิกใช้สำหรับความปลอดภัย มีการสาธิต collision แล้ว
- ยังใช้สำหรับ: ระบบเก่า ตัวระบุ Git commit
SHA-256
- ผลลัพธ์: 256 บิต (64 ตัวอักษรฐานสิบหก)
- สถานะ: มาตรฐานปัจจุบัน ไม่มีการโจมตีเชิงปฏิบัติที่รู้จัก
- ใช้สำหรับ: จัดเก็บรหัสผ่าน ลายเซ็นดิจิทัล blockchain การตรวจสอบไฟล์ ใบรับรอง TLS
SHA-512
- ผลลัพธ์: 512 บิต (128 ตัวอักษรฐานสิบหก)
- สถานะ: มาตรฐานปัจจุบัน มีขอบเขตความปลอดภัยมากกว่า SHA-256
- ใช้สำหรับ: แอปพลิเคชันความปลอดภัยสูง บางรูปแบบการ hash รหัสผ่าน
คำเตือน MD5 และ SHA-1 ไม่ควรใช้สำหรับจุดประสงค์ความปลอดภัย (รหัสผ่าน ลายเซ็นดิจิทัล ใบรับรอง) มันถูกเจาะทางการเข้ารหัสแล้ว ใช้ SHA-256 หรือ SHA-512 สำหรับทุกอย่างที่เกี่ยวกับความปลอดภัย
Hash ใช้ที่ไหน
การจัดเก็บรหัสผ่าน
เมื่อคุณสร้างบัญชี เว็บไซต์ไม่ได้ (หรือไม่ควร) เก็บรหัสผ่านจริงของคุณ แต่เก็บ hash ของรหัสผ่านแทน เมื่อคุณล็อกอิน ระบบจะ hash รหัสผ่านที่ป้อนแล้วเปรียบเทียบกับ hash ที่เก็บไว้ ถ้าตรงกัน คุณก็เข้าได้
หมายความว่าแม้ฐานข้อมูลจะถูกเจาะ ผู้โจมตีได้ hash ไม่ใช่รหัสผ่าน พวกเขาไม่สามารถย้อน hash เพื่อหารหัสผ่าน (แม้ว่าจะลองเดาโดย hash รหัสผ่านทั่วไปแล้วเปรียบเทียบได้)
การ hash รหัสผ่านสมัยใหม่ก้าวหน้าขึ้นด้วยอัลกอริทึมเช่น bcrypt, scrypt และ Argon2 ที่เพิ่ม salt (ข้อมูลสุ่ม) และจงใจทำให้ช้าเพื่อให้การเดาแบบ brute-force ไม่คุ้ม
การตรวจสอบไฟล์
เมื่อคุณดาวน์โหลดซอฟต์แวร์ เว็บไซต์มักให้ SHA-256 hash ของไฟล์ หลังจากดาวน์โหลด คุณ hash ไฟล์เองแล้วเปรียบเทียบ ถ้า hash ตรงกัน ไฟล์เป็นสิ่งที่ผู้เผยแพร่ตั้งใจ ถ้าต่างกัน ไฟล์ถูกเสียหายหรือดัดแปลงระหว่างดาวน์โหลด
คาดหวัง: a1b2c3d4e5f6...
ไฟล์คุณ: a1b2c3d4e5f6... ✓ ตรงกัน — ไฟล์ถูกต้อง
Blockchain และสกุลเงินดิจิทัล
ทุกบล็อกใน blockchain มี hash ของบล็อกก่อนหน้า สร้างโซ่ที่ไม่สามารถทำลายได้ หากมีคนพยายามแก้ไขธุรกรรมในอดีต hash ของบล็อกนั้นจะเปลี่ยน ซึ่งทำลายโซ่ตั้งแต่จุดนั้นเป็นต้นไป ทำให้ตรวจจับการดัดแปลงได้ทันที
การขุด Bitcoin คือการแข่งขันหาอินพุตที่ให้ SHA-256 hash ที่ขึ้นต้นด้วยศูนย์จำนวนหนึ่ง
ลายเซ็นดิจิทัล
เมื่อคุณเซ็นเอกสารดิจิทัล คุณไม่ได้เข้ารหัสเอกสารทั้งหมดด้วยคีย์ส่วนตัว แต่เอกสารถูก hash แล้ว hash ถูกเข้ารหัส วิธีนี้เร็วกว่ามากและสร้างลายเซ็นที่กะทัดรัด
การกำจัดข้อมูลซ้ำ
บริการจัดเก็บข้อมูลบนคลาวด์ใช้ hash ตรวจจับไฟล์ซ้ำ ถ้าผู้ใช้สองคนอัปโหลดไฟล์เดียวกัน มันมี hash เดียวกัน และบริการต้องเก็บแค่สำเนาเดียว
Git Version Control
ทุก commit ไฟล์ และ tree ใน Git ถูกระบุด้วย SHA-1 hash นี่คือวิธีที่ Git รู้ว่าไฟล์เปลี่ยนแปลงหรือไม่และติดตามประวัติทั้งหมดของโปรเจกต์
รู้หรือไม่? Git กำลังค่อยๆ เปลี่ยนจาก SHA-1 เป็น SHA-256 การเปลี่ยนแปลงเริ่มต้นเพราะ SHA-1 collision ถูกสาธิตในปี 2017 ทำให้ในทางทฤษฎีมีคนสร้างสอง commit ที่มีตัวระบุเดียวกันได้
ปัญหาความไม่สามารถย้อนกลับได้ (และทำไมมันสำคัญ)
ธรรมชาติทางเดียวของ hash เป็นทั้งจุดแข็งที่สุดและแหล่งความสับสนที่พบบ่อย
คุณไม่สามารถ "ถอดรหัส" hash ได้ Hash ไม่ใช่การเข้ารหัส การเข้ารหัสเป็นสองทาง: เข้ารหัสด้วยคีย์ ถอดรหัสด้วยคีย์ การ hash เป็นทางเดียว: คุณคำนวณ hash จากอินพุตได้ แต่คำนวณอินพุตจาก hash ไม่ได้
วิธีเดียวที่จะ "ย้อน" hash คือเดาอินพุตต้นฉบับ hash การเดาของคุณ แล้วตรวจสอบว่าตรงกันหรือไม่ สำหรับอินพุตสั้นและง่าย (เช่น รหัสผ่านทั่วไป) วิธีนี้เป็นไปได้ สำหรับอินพุตยาวและสุ่ม มันเป็นไปไม่ได้ในทางการคำนวณ
นี่คือเหตุผลที่ความยาวรหัสผ่านสำคัญมาก hash ของ "password123" สามารถหาได้โดยลองรหัสผ่านทั่วไป hash ของ "j8#kL9$mN2@pQ5&" จะใช้เวลานานกว่าอายุจักรวาลในการหาโดยการเดา
ลองด้วยตัวเอง
วิธีที่ดีที่สุดในการเข้าใจ hash คือการทดลอง hash คำหนึ่ง แล้วเปลี่ยนตัวอักษรหนึ่งตัวแล้วดูว่าผลลัพธ์เปลี่ยนอย่างสิ้นเชิง hash ไฟล์ก่อนและหลังแก้ไขแล้วดูความแตกต่าง
เคล็ดลับ สร้างและตรวจสอบ hash สำหรับข้อความหรือไฟล์ใดก็ได้: วิธีสร้างและตรวจสอบ Hash ลอง SHA-256, MD5, SHA-512 และอื่นๆ — ทันที ฟรี ในเบราว์เซอร์
สำรวจ hash ด้วยตัวเอง:
ฟรี ทันที และไม่ต้องลงทะเบียน