Mã băm là một chuỗi ngắn tính ra từ toàn bộ nội dung tệp; chỉ cần một bit đổi thì chuỗi đổi hoàn toàn. Tạo mã SHA-256 cho mọi tệp, lưu thành bảng kê đặt cạnh dữ liệu, rồi tính lại sau mỗi lần chép hay định kỳ; mã khác là tệp đã hỏng.
Tệp hỏng hiếm khi báo lỗi. Một ổ cứng bắt đầu có cung hỏng, một lần rút USB khi chưa ghi xong, một dịch vụ đồng bộ ghi đè bằng phiên bản dở dang: tệp vẫn còn đó, đúng tên, đúng dung lượng, chỉ là bên trong đã khác. Với dữ liệu nghiên cứu không thu lại được, phát hiện muộn có nghĩa là mất luôn cả bản sao lưu, vì bản lỗi đã được sao lưu đè lên. Mã băm là cách rẻ nhất để biết sớm.
Mã băm hoạt động thế nào?
Hàm băm nhận đầu vào là toàn bộ các byte của tệp và trả ra một chuỗi có độ dài cố định. SHA-256 cho chuỗi 64 ký tự thập lục phân. Cùng một tệp luôn cho cùng một chuỗi, trên mọi máy, mọi hệ điều hành. Hai tệp khác nhau dù chỉ một ký tự gần như chắc chắn cho hai chuỗi khác hẳn nhau.
Mã băm không sửa được tệp hỏng và không cho biết hỏng ở đâu. Nó chỉ trả lời một câu hỏi có hoặc không: tệp này có còn giống hệt lúc tạo mã không. Muốn khôi phục thì vẫn phải có bản sao lưu khác còn tốt, và mã băm chính là thứ giúp bạn biết bản nào còn tốt.
Một ví dụ quen thuộc: nhóm chép bộ ảnh hiển vi vài trăm gigabyte từ máy đo sang ổ ngoài, rồi từ ổ ngoài sang máy chủ khoa. Vài tháng sau, một số ảnh mở ra bị sọc. Không ai biết hỏng ở bước nào, và bản trên máy đo đã bị xoá để lấy chỗ. Nếu có bảng kê tạo ngay trên máy đo, chỉ cần một lệnh là biết tệp nào hỏng và hỏng từ bước chép nào.
Chọn thuật toán nào?
Với mục đích phát hiện hỏng do vô tình, thuật toán nào phổ biến cũng dùng được. Khác biệt nằm ở khả năng chống làm giả có chủ đích.
| Thuật toán | Độ dài mã | Chống làm giả | Nên dùng khi |
|---|---|---|---|
| MD5 | 32 ký tự | Không còn an toàn, đã có cách tạo hai tệp trùng mã | Đối chiếu với kho hoặc hệ thống cũ chỉ cung cấp MD5 |
| SHA-1 | 40 ký tự | Không còn an toàn | Tránh dùng cho dự án mới |
| SHA-256 | 64 ký tự | An toàn theo hiểu biết hiện nay | Mặc định cho dữ liệu nghiên cứu |
| SHA-512 | 128 ký tự | An toàn | Khi quy định của đơn vị yêu cầu |
Zenodo hiển thị mã MD5 cho từng tệp tải lên. Bạn có thể tính MD5 ở máy rồi so với con số trên trang để chắc tệp đã lên đủ, đồng thời vẫn giữ bảng kê SHA-256 của mình làm chuẩn lưu trữ.
Tạo và kiểm mã băm bằng lệnh có sẵn trên máy
Không cần cài thêm phần mềm. Ba hệ điều hành phổ biến đều có sẵn lệnh. Trong các ví dụ, đứng ở thư mục gốc của bộ dữ liệu trước khi chạy để đường dẫn trong bảng kê là đường dẫn tương đối, mang sang ổ khác vẫn kiểm được.
Windows
Trong Command Prompt, gõ certutil -hashfile khaosat.csv SHA256. Trong PowerShell, gõ Get-FileHash khaosat.csv -Algorithm SHA256; mặc định lệnh này đã dùng SHA256. Tính cho cả thư mục bằng PowerShell: Get-ChildItem -Recurse -File | Get-FileHash -Algorithm SHA256 | Export-Csv bangke.csv -NoTypeInformation, ra một tệp CSV có thuật toán, mã và đường dẫn. Lưu ý Get-FileHash ghi đường dẫn đầy đủ tính từ ổ đĩa, nên khi kiểm trên ổ khác cần so theo tên tệp hoặc dùng một đoạn mã nhỏ cắt phần đầu đường dẫn. Kiểm một tệp đơn lẻ thì chỉ cần chạy lại lệnh và so chuỗi bằng mắt hoặc bằng phép so sánh trong PowerShell.
macOS
Mở Terminal, gõ shasum -a 256 khaosat.csv. Cho cả thư mục: find . -type f ! -name bangke.sha256 -exec shasum -a 256 {} + > bangke.sha256. Kiểm lại toàn bộ: shasum -a 256 -c bangke.sha256; mỗi dòng in OK hoặc FAILED.
Linux
Gõ sha256sum khaosat.csv. Cho cả thư mục: find . -type f ! -name bangke.sha256 -exec sha256sum {} + > bangke.sha256. Kiểm: sha256sum -c bangke.sha256; thêm --quiet để chỉ in những tệp lỗi. Định dạng tệp bảng kê của sha256sum và shasum -a 256 giống nhau, nên tạo trên Linux kiểm trên macOS được.
Lưu bảng kê kèm bộ dữ liệu như thế nào?
Bảng kê chỉ có ích khi đi cùng dữ liệu và được tạo lúc dữ liệu còn tốt chắc chắn:
- Tạo bảng kê ngay sau khi chốt một phiên bản dữ liệu, ví dụ sau khi nhập liệu xong hoặc sau khi làm sạch xong.
- Đặt tệp bảng kê ở thư mục gốc, tên rõ như
bangke.sha256, ghi trong README thuật toán đã dùng và lệnh để kiểm. - Lưu thêm một bản bảng kê ở nơi khác dữ liệu, ví dụ trong kho mã hoặc gửi email cho chính mình, để nếu cả ổ hỏng vẫn còn mã đối chiếu.
- Khi dữ liệu đổi phiên bản, tạo bảng kê mới, giữ bảng kê cũ đi kèm phiên bản cũ.
- Với bộ dữ liệu lớn hoặc cần bàn giao chính thức, cân nhắc đóng gói theo chuẩn BagIt (đặc tả RFC 8493): thư mục chứa dữ liệu, bảng kê
manifest-sha256.txtvà tệp thông tin gói, có công cụ tạo và kiểm tự động.
Khi nào cần kiểm lại?
Sau mỗi lần chép sang ổ khác. Chép xong, chạy lệnh kiểm trên bản mới. Đây là lúc dễ hỏng nhất, nhất là với USB và ổ ngoài rút vội.
Trước khi xoá bản gốc. Không bao giờ xoá bản gốc khi bản mới chưa qua kiểm mã băm.
Định kỳ trên kho lưu trữ dài hạn. Ổ cứng để lâu không dùng vẫn có thể hỏng. Đặt lịch kiểm mỗi quý hoặc mỗi sáu tháng cho ổ lưu trữ, ghi kết quả vào nhật ký.
Sau khi tải về từ kho dữ liệu. So với mã kho công bố để chắc tệp tải đủ, nhất là tệp vài chục gigabyte.
Khi nghi ngờ có người sửa. Dữ liệu gốc đã khoá mà bảng kê báo khác là tín hiệu cần điều tra, kể cả khi lý do hoá ra vô hại.
Đưa việc kiểm mã băm vào nếp làm hằng ngày
Kiểm khi sao chép bằng rsync
Người dùng macOS và Linux sao chép thư mục lớn bằng rsync có thể thêm tuỳ chọn --checksum để công cụ so nội dung thay vì chỉ so thời gian sửa và kích thước khi quyết định tệp nào cần chép. Tuỳ chọn này chậm hơn nhưng không thay được bảng kê: rsync so hai bên với nhau, còn bảng kê so với trạng thái lúc dữ liệu còn tốt chắc chắn.
Ghi nhật ký kiểm
Mỗi lần kiểm, ghi một dòng vào tệp nhật ký: ngày, ổ nào, số tệp đạt, số tệp lỗi, người kiểm. Khi có sự cố, nhật ký cho biết dữ liệu hỏng trong khoảng thời gian nào, từ đó chọn bản sao lưu đủ cũ để khôi phục.
Phân công rõ người làm
Việc kiểm định kỳ hay bị bỏ vì không ai được giao. Ghi tên người phụ trách trong kế hoạch quản lý dữ liệu, đặt lịch nhắc trên lịch chung của nhóm. Với nhóm có máy chủ, một tác vụ chạy định kỳ gửi thư khi có tệp lỗi là đủ.
Lỗi hay gặp khi dùng mã băm
Phần lớn sự cố đến từ quy trình, không phải từ thuật toán.
| Hiện tượng | Nguyên nhân | Cách xử lý |
|---|---|---|
| Mọi tệp báo lỗi không tìm thấy | Chạy lệnh kiểm ở sai thư mục, bảng kê dùng đường dẫn tương đối | Chuyển về thư mục gốc của bộ dữ liệu rồi chạy lại |
| Tệp bảng kê tự báo lỗi | Bảng kê được tính trong lúc chính nó đang được ghi | Loại tệp bảng kê khỏi danh sách tính, như ví dụ dùng ! -name |
| Tệp văn bản mở ra giống hệt nhưng mã khác | Kiểu xuống dòng bị đổi khi chép qua công cụ đồng bộ hoặc Git | Tắt chuyển đổi xuống dòng tự động; so lại byte bằng công cụ so tệp |
| Tệp Excel đổi mã dù không sửa gì | Mở rồi lưu lại, phần mềm ghi thêm siêu dữ liệu | Đặt bản chốt ở chế độ chỉ đọc, làm việc trên bản sao |
| Không biết mã nào là đúng | Tạo bảng kê sau khi tệp đã hỏng | Tạo bảng kê sớm, lưu thêm một bản ở nơi khác |
Câu hỏi thường gặp
Mã băm có phải là mã hoá dữ liệu không?
Không. Mã băm chỉ là dấu vân tay để so sánh, không giấu nội dung và không giải ngược được ra tệp. Muốn bảo mật dữ liệu phải dùng công cụ mã hoá riêng.
Dùng MD5 cho dữ liệu nghiên cứu có được không?
Để phát hiện hỏng do vô tình thì MD5 vẫn bắt được. Nhưng MD5 không chống được làm giả có chủ đích, nên dự án mới nên dùng SHA-256 làm chuẩn.
Đổi tên tệp có làm đổi mã băm không?
Không. Mã băm tính từ nội dung, không tính từ tên. Tuy vậy bảng kê ghi theo tên, nên đổi tên thì lệnh kiểm sẽ báo không tìm thấy tệp.
Bao lâu nên kiểm mã băm một lần?
Kiểm ngay sau mỗi lần chép hoặc tải về, và định kỳ mỗi quý hoặc mỗi sáu tháng cho ổ lưu trữ dài hạn. Ghi kết quả vào nhật ký để biết lần cuối dữ liệu còn tốt là khi nào.
Dịch vụ đám mây đã kiểm toàn vẹn rồi, có cần mã băm riêng không?
Nên có. Dịch vụ kiểm việc truyền tải, nhưng không biết tệp đã hỏng từ máy bạn trước khi tải lên, cũng không biết khi bạn chép từ đám mây sang ổ khác.