Giải thích về hàm băm
Hàm băm biến bất kỳ dữ liệu đầu vào nào thành một "dấu vân tay" ngắn có độ dài cố định. Hướng dẫn này giải thích MD5, SHA-1 và SHA-256 hữu ích cho việc gì, hạn chế của chúng ở đâu và cách so sánh một tệp với checksum đã công bố.
Hash là gì
Hàm băm mật mã đọc dữ liệu có kích thước bất kỳ và tạo ra một bản tóm lược (digest) có độ dài cố định: 128 bit với MD5, 160 bit với SHA-1 và 256 bit với SHA-256, thường được hiển thị dưới dạng văn bản thập lục phân. Cùng một đầu vào luôn cho cùng một digest, và chỉ cần thay đổi một bit của đầu vào cũng tạo ra digest rất khác. Hash là một chiều: bạn không thể khôi phục đầu vào từ digest, trừ khi đoán các đầu vào và so sánh kết quả.
Hướng dẫn này cung cấp thông tin chung. Với các quyết định về bảo mật, hãy tuân theo yêu cầu của tổ chức bạn hoặc của dịch vụ bạn đang làm việc cùng.
Checksum và tính toàn vẹn
Cách dùng phổ biến nhất hằng ngày là kiểm tra một tệp có đến nơi nguyên vẹn hay không. Trang tải xuống có thể công bố giá trị SHA-256 bên cạnh tệp. Sau khi tải về, bạn tính hash của bản sao trên máy và so sánh với giá trị đã công bố. Nếu hai giá trị khớp, rất có thể tệp giống hệt tệp mà bên phát hành đã tính hash; nếu khác nhau, bản tải về bị hỏng hoặc tệp là một phiên bản khác.
Checksum chỉ có ích nếu bản thân giá trị được công bố là đáng tin cậy. Nếu kẻ tấn công có thể thay đổi cả tệp lẫn checksum trên cùng một trang, hash khớp cũng chẳng chứng minh được nhiều. Chữ ký số giải quyết vấn đề đó.
Vì sao MD5 và SHA-1 không dùng cho bảo mật
Một hàm băm an toàn phải khiến việc tìm hai đầu vào khác nhau có cùng digest (va chạm) trở nên không khả thi trên thực tế. Các kiểu tấn công va chạm thực tế đã được công bố cho cả MD5 và SHA-1, nên kẻ tấn công có thể chuẩn bị hai tệp khác nhau có cùng hash. Vì lý do này, chúng không còn được coi là phù hợp cho chữ ký số, chứng chỉ hay các mục đích bảo mật khác.
MD5 và SHA-1 vẫn có thể phát hiện lỗi hỏng dữ liệu ngẫu nhiên, và một số hệ thống cũ vẫn công bố chúng. Với công việc mới, SHA-256 hoặc một thành viên khác của họ SHA-2 (SHA-384, SHA-512) là lựa chọn thông thường.
| Thuật toán | Độ dài digest | Tình trạng bảo mật |
|---|---|---|
| MD5 | 128 bit (32 ký tự hex) | Đã bị phá về va chạm; chỉ dùng cho checksum cũ |
| SHA-1 | 160 bit (40 ký tự hex) | Đã bị phá về va chạm; chỉ dùng cho hệ thống cũ |
| SHA-256 | 256 bit (64 ký tự hex) | Được dùng rộng rãi và khuyến nghị |
| SHA-384 / SHA-512 | 384 / 512 bit | Được dùng rộng rãi và khuyến nghị |
Băm không phải là mã hóa, và mật khẩu cần nhiều hơn thế
Mã hóa có thể đảo ngược khi có đúng khóa; băm không được thiết kế để đảo ngược. Tuy vậy, hash không che giấu được những đầu vào ngắn hoặc dễ đoán: bất kỳ ai cũng có thể băm các từ thông dụng hoặc số điện thoại rồi tìm giá trị khớp.
Đó là lý do chỉ dùng các hàm băm nhanh như MD5 hay SHA-256 thì không phù hợp để lưu mật khẩu. Chúng được thiết kế để chạy nhanh, cho phép kẻ tấn công thử một số lượng rất lớn phỏng đoán trong thời gian ngắn. Việc lưu mật khẩu dùng các thuật toán chậm, có salt, được xây dựng riêng cho mục đích này, như Argon2, scrypt hoặc bcrypt. Nếu bạn xây dựng hệ thống đăng nhập, hãy dùng một thư viện được duy trì và hướng dẫn hiện hành cho nền tảng của bạn thay vì một hàm băm đa dụng.
HMAC để xác thực thông điệp
Hash thông thường cho biết dữ liệu có thay đổi hay không, nhưng ai cũng có thể tính lại nó. HMAC (mã xác thực thông điệp dựa trên hash) kết hợp dữ liệu với một khóa bí mật, ví dụ HMAC-SHA256. Chỉ người biết khóa mới tạo được giá trị đúng, nên bên nhận có thể kiểm tra thông điệp đến từ người giữ khóa và không bị thay đổi. Webhook và việc ký yêu cầu API thường dùng HMAC. Hãy giữ bí mật khóa; bất kỳ ai có khóa đều có thể tạo mã hợp lệ.
Vì sao cùng một văn bản lại cho hash khác nhau
Hash được tính trên các byte, không phải trên văn bản bạn nhìn thấy. Những khác biệt sau làm thay đổi kết quả:
- Ký tự xuống dòng: Windows dùng CR LF, còn Linux và macOS dùng LF.
- Bảng mã ký tự: "é" là các byte khác nhau trong UTF-8 và trong các bảng mã cũ hơn.
- Ký tự xuống dòng hoặc dấu cách ở cuối, hay dấu thứ tự byte (BOM) ở đầu tệp.
- Chữ hoa hay chữ thường trong dữ liệu đầu vào.
Khi hash không khớp, hãy kiểm tra những điểm này trước. Tính hash của tệp gốc thường đáng tin cậy hơn tính hash của văn bản sao chép từ tệp đó. Bản thân đầu ra hex không phân biệt chữ hoa chữ thường: A1B2 và a1b2 là cùng một giá trị.
Câu hỏi thường gặp
Tôi có thể giải mã hash MD5 hoặc SHA-256 không?
Không. Hash không phải là dữ liệu được mã hóa. Các dịch vụ "giải mã" trực tuyến tra cứu hash được tính sẵn của các đầu vào thông dụng, đó là lý do hash của các giá trị đơn giản chỉ bảo vệ được rất ít.
Tôi nên dùng thuật toán nào để xác minh tệp tải về?
Hãy dùng thuật toán mà bên phát hành cung cấp. Nếu có nhiều lựa chọn, SHA-256 hoặc SHA-512 là lựa chọn tốt hơn MD5 hay SHA-1.
Công cụ Tạo mã hash có tải tệp của tôi lên không?
Công cụ Tạo mã hash của LeedyBox tính hash trên trình duyệt của bạn, nên văn bản hoặc tệp bạn chọn được xử lý trên thiết bị của bạn.