Toolora

วิธีตรวจไฟล์ที่ดาวน์โหลดด้วย 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 ขาดไปเงียบ ๆ ใช้เวลามากกว่านั้นมาก