วิธีตรวจไฟล์ที่ดาวน์โหลดด้วย checksum
checksum พิสูจน์อะไรได้ อะไรที่มันไม่ได้พิสูจน์ และคำสั่งที่ใช้ตรวจบน macOS Linux และ Windows
คุณดาวน์โหลดไฟล์ ISO หรือตัวติดตั้งมา แล้วหน้าดาวน์โหลดมีข้อความเลขฐานสิบหกยาว ๆ กำกับว่า SHA256 หรือมีไฟล์ชื่อ SHA256SUMS ให้โหลดเพิ่ม คำแนะนำมักจบแค่ว่า “ตรวจว่าตรงกัน” โดยแทบไม่มีใครอธิบายว่าตรงกันแล้วได้อะไร
พูดกันตรง ๆ: checksum พิสูจน์ได้เพียงว่าไฟล์ที่คุณมีเหมือนกับไฟล์ที่เจ้าของประกาศค่าแฮชไว้ทุกไบต์ แค่นั้น ส่วนจะมีค่าแค่ไหน ขึ้นอยู่กับว่าค่าแฮชนั้นมาจากไหน
การตรวจนี้พิสูจน์อะไรได้จริง
การเอาไฟล์ไปคำนวณด้วย SHA-256 จะได้ลายนิ้วมือความยาวคงที่ออกมา เปลี่ยนข้อมูลไปเพียงไบต์เดียวที่ตำแหน่งใดก็ตาม ลายนิ้วมือจะเปลี่ยนไปคนละเรื่อง ถ้าค่าที่คำนวณได้ตรงกับที่ประกาศไว้ ก็มั่นใจได้ว่าไฟล์มาถึงครบถ้วน
เรื่องนี้แก้ปัญหาที่เจอกันบ่อยจริง ไฟล์ดาวน์โหลดเสียหายระหว่างทางเกิดขึ้นได้เสมอ เน็ตหลุดแล้วโหลดต่อไม่สมบูรณ์ ฮาร์ดดิสก์เขียนพลาด หรือเซิร์ฟเวอร์ส่งไฟล์มาไม่ครบ อาการที่ได้คือตัวติดตั้งทำงานไปครึ่งทางแล้วขึ้น error ที่อ่านไม่รู้เรื่อง ซึ่ง checksum บอกคุณได้ในสองวินาทีว่าปัญหาอยู่ที่ไฟล์ ไม่ใช่ที่ตัวติดตั้ง
สิ่งที่มันไม่ได้พิสูจน์คือเจ้าของไฟล์น่าเชื่อถือหรือไม่ และไฟล์นั้นปลอดภัยหรือไม่ มัลแวร์ก็มีค่าแฮชตรงกับตัวมันเองเป๊ะเหมือนกัน
ปัญหาของค่าแฮชที่อยู่หน้าเดียวกับไฟล์
ส่วนนี้คือส่วนที่คู่มือส่วนใหญ่ข้ามไป
ถ้าผู้โจมตีเปลี่ยนไฟล์บนเซิร์ฟเวอร์ดาวน์โหลดได้ เขาก็มักเปลี่ยนค่าแฮชที่พิมพ์อยู่ข้าง ๆ ได้ด้วย เซิร์ฟเวอร์เดียวกัน การเจาะครั้งเดียวกัน บ่ายวันเดียวกัน คุณจะคำนวณค่าแฮช เทียบกับที่หน้าเว็บบอก เห็นว่าตรงกัน แล้วติดตั้งไฟล์อันตรายด้วยความมั่นใจที่มากกว่าตอนที่ไม่มี checksum ให้ตรวจเสียอีก
ดังนั้น checksum ที่ประกาศอยู่หน้าเดียวกับไฟล์คือเครื่องมือกันความผิดพลาด ไม่ใช่เครื่องมือกันคนร้าย ซึ่งก็ยังมีประโยชน์ เพราะไฟล์เสียหายระหว่างทางเกิดบ่อยกว่าการถูกโจมตีแบบเจาะจงมาก แต่ควรรู้ว่าตัวเองกันความเสี่ยงข้อไหนไปแล้วบ้าง
checksum ป้องกันได้จริงเมื่อไหร่
ค่าแฮชจะมีความหมายขึ้นมาทันที เมื่อมันอยู่คนละที่กับไฟล์ จนผู้โจมตีต้องเจาะเพิ่มอีกแห่ง
กรณีที่คนไทยเจอบ่อยที่สุดคือ การโหลดผ่าน mirror เช่นโหลด Ubuntu จาก mirror ของมหาวิทยาลัยในไทยเพราะเร็วกว่ามาก แล้วเอาค่าแฮชจากเว็บ ubuntu.com มาเทียบ นี่คือการใช้ checksum ที่ถูกต้องที่สุด เพราะค่าแฮชมาจากคนละที่กับไฟล์ ถ้า mirror ถูกแก้ไขหรือส่งไฟล์เก่ามา คุณจะรู้ทันที
กรณีอื่นที่ค่าแฮชมีน้ำหนักจริง:
- ไฟล์
SHA256SUMSที่เซ็นด้วย GPG — ตัวลายเซ็นต่างหากที่ให้ความปลอดภัย ค่าแฮชบอกว่าไฟล์ตรงกับในรายการ ส่วนลายเซ็นบอกว่ารายการนั้นมาจากเจ้าของจริงและไม่ถูกแก้ การตรวจแค่ค่าแฮชโดยไม่ตรวจลายเซ็น คือทำครึ่งที่ง่ายแล้วข้ามครึ่งที่มีประโยชน์ - ตัวจัดการแพ็กเกจ — apt, Homebrew, npm ตรวจค่าแฮชกับ index ที่เซ็นไว้ให้อัตโนมัติอยู่แล้ว นี่คือเหตุผลที่การติดตั้งผ่านตัวจัดการแพ็กเกจปลอดภัยกว่าการโหลดตัวติดตั้งมาเองโดยทั่วไป
ถ้าหน้าดาวน์โหลดมีไฟล์ลายเซ็นให้ด้วย ตัวลายเซ็นคือสิ่งที่ควรตรวจจริง ๆ
วิธีคำนวณค่าแฮช
บน macOS และ Linux มีคำสั่ง shasum ติดมาแทบทุกเครื่อง
shasum -a 256 ubuntu.iso
บน Linux ส่วนใหญ่มีคำสั่งเฉพาะให้ด้วย
sha256sum ubuntu.iso
ทั้งคู่จะพิมพ์ค่าแฮชตามด้วยชื่อไฟล์ ส่วนบน Windows นั้น PowerShell มีมาให้ในตัว
Get-FileHash ubuntu.iso -Algorithm SHA256
PowerShell ใช้ SHA-256 เป็นค่าเริ่มต้นอยู่แล้ว จะไม่ใส่ -Algorithm ก็ได้ แต่แนะนำให้ใส่ เพราะการที่คู่มือเขียนว่า SHA256 แต่คำสั่งไปเลือกอย่างอื่นเงียบ ๆ คือต้นเหตุคลาสสิกของการเทียบค่าผิดตัว
วิธีเทียบค่าสองค่า
อย่าอ่านเลขฐานสิบหก 64 ตัวด้วยตาแล้วเทียบเอง คนส่วนใหญ่ดูแค่หกตัวหน้ากับหกตัวหลัง ซึ่งเป็นการเทียบแบบที่ไฟล์ปลอมผ่านได้สบาย
ถ้าเจ้าของไฟล์ให้ SHA256SUMS มา ให้เครื่องเทียบให้
sha256sum -c SHA256SUMS
ถ้าตรงกันจะขึ้น ubuntu.iso: OK ถ้าไม่ตรงจะขึ้น FAILED พร้อมคำเตือน และจบการทำงานด้วยรหัสที่ไม่ใช่ศูนย์ ซึ่งสำคัญมากถ้าคุณเอาไปใส่ในสคริปต์ บน macOS ใช้ shasum -a 256 -c SHA256SUMS แทนได้
ถ้ามีแค่ข้อความค่าแฮชบนหน้าเว็บ ให้วางทั้งสองค่าลงในเครื่องมือที่เทียบทีละตัวอักษรให้ และพึงระวังว่าค่าแฮชที่ประกาศบนเว็บมักเป็นตัวพิมพ์ใหญ่ ส่วนคำสั่งใน terminal พิมพ์ออกมาเป็นตัวพิมพ์เล็ก ทั้งสองคือค่าเดียวกัน ให้เทียบโดยไม่สนตัวพิมพ์เล็กใหญ่ แทนที่จะสรุปว่าไม่ตรงกัน
อัลกอริทึมที่จะเจอ
| สิ่งที่หน้าเว็บให้มา | ควรทำอย่างไร |
|---|---|
| SHA-256 | กรณีปกติ ใช้ได้เลย |
| SHA-512 | ใช้ได้ ไม่ต่างกันในทางปฏิบัติสำหรับงานนี้ |
| มีแค่ MD5 หรือ SHA-1 | ใช้กันไฟล์เสียหายได้ แต่กันการถูกแก้ไขไม่ได้ |
| มีไฟล์ลายเซ็นมาด้วย | ตรวจลายเซ็นแทน เพราะนั่นคือส่วนที่มีน้ำหนักจริง |
สรุปจากตารางคือ อัลกอริทึมแทบไม่มีผลกับการจับไฟล์ที่เสียหาย เพราะทุกตัวจับไบต์ที่เปลี่ยนไปได้หมด แต่มันสำคัญมากทันทีที่มีคนตั้งใจปั้นไฟล์สองไฟล์ให้ค่าแฮชตรงกัน ซึ่งเป็นเหตุผลว่าทำไมMD5 จึงใช้ได้กับงานหนึ่งและใช้ไม่ได้กับอีกงานหนึ่ง
เครื่องมือนี้ทำอะไรได้และทำอะไรไม่ได้
ขอบอกตรง ๆ ว่าเครื่องมือสร้างค่าแฮชของเราคำนวณจากข้อความที่คุณวางลงไป ไม่ใช่ไฟล์ที่คุณเลือก สำหรับการตรวจไฟล์ ISO ขนาด 5 GB คำสั่งใน terminal ข้างบนคือเครื่องมือที่ถูกต้อง ไม่ใช่ช่องข้อความในเบราว์เซอร์ เราอยากบอกไว้ตรงนี้เลย ดีกว่าให้คุณไปรู้เอาตอนที่วางชื่อไฟล์ลงไปแล้วสงสัยว่าทำไมค่าที่ได้ดูแปลก ๆ
จุดที่มันช่วยได้จริงคือขั้นตอนการเทียบ วางค่าที่เว็บประกาศกับค่าที่ terminal พิมพ์ออกมา แล้วดูว่าตรงกันจริงไหม แทนที่จะเพ่งตาเทียบเอง นอกจากนี้ยังใช้คำนวณค่าแฮชของข้อความสั้น ๆ ตรวจค่าใน config หรือแค่ดูว่าค่า SHA-256 หน้าตาเป็นอย่างไรก่อนจะไปเชื่อค่าไหน
เครื่องมือทำงานในเบราว์เซอร์ของคุณทั้งหมด ซึ่งสำคัญกับงานนี้เป็นพิเศษ เพราะข้อความที่คนมักเอามาวางในเครื่องมือแฮชคือสิ่งที่ไม่อยากส่งให้เซิร์ฟเวอร์ของคนแปลกหน้าที่สุด ทั้ง API key ชิ้นส่วนของ config หรือรหัสผ่านที่กำลังจะเอาไปตรวจว่าหลุดหรือยัง
การตรวจไฟล์ใช้เวลาราวสิบวินาที การลงระบบปฏิบัติการใหม่เพราะไฟล์ ISO ขาดไปเงียบ ๆ ใช้เวลามากกว่านั้นมาก