Hash dùng để làm gì
Hàm băm mật mã biến đầu vào có kích thước bất kỳ thành một dấu vân tay có độ dài cố định. Cùng một đầu vào luôn cho ra cùng một giá trị băm (digest), và thay đổi chỉ một bit của đầu vào sẽ cho ra một giá trị hoàn toàn khác. Bạn không thể dựng lại đầu vào từ giá trị băm, và với các thuật toán hiện đại, trên thực tế bạn không thể tìm được hai đầu vào có cùng giá trị băm.
Điều đó khiến hash hữu ích bất cứ khi nào bạn cần biết hai thứ có giống hệt nhau không mà không phải so sánh từng byte:
- Kiểm tra tệp tải về. ISO Linux, ảnh firmware và nhiều trình cài đặt công bố SHA-256 bên cạnh liên kết tải. Nếu tệp của bạn cho cùng giá trị, nó đã đến nơi nguyên vẹn.
- Phát hiện tệp trùng lặp. Hai bức ảnh hoặc tài liệu có cùng SHA-256 là cùng một tệp, bất kể tên của chúng.
- Khóa bộ nhớ đệm và ETag. Máy chủ web và công cụ build băm nội dung để biết nó có thay đổi hay không.
- Toàn vẹn trong API. Webhook, tệp khóa gói và thuộc tính Subresource Integrity đều dựa vào giá trị băm.
- Gỡ lỗi. So sánh hash mà mã của bạn tính ra với một giá trị tham chiếu cho thấy nhanh chóng lỗi nằm ở bước băm hay ở đầu vào.
So sánh năm thuật toán
Công cụ tính cả năm cùng lúc, nên bạn có thể đối chiếu với bất kỳ định dạng nào một trang web công bố.
- MD5, 128 bit, 32 ký tự hex. Được thiết kế năm 1991. Từ năm 2004 đã có thể tạo va chạm trong thực tế, nên không được dùng ở nơi kẻ tấn công có thể tạo đầu vào. Vẫn phổ biến cho kiểm tra trùng lặp nhanh và checksum kiểu cũ.
- SHA-1, 160 bit, 40 ký tự hex. Bị loại bỏ sau va chạm công khai đầu tiên năm 2017. Git từ trước đến nay nhận diện đối tượng bằng SHA-1, đó là lý do nó vẫn có mặt khắp nơi.
- SHA-256, 256 bit, 64 ký tự hex. Mặc định hiện nay cho checksum, chứng chỉ, trình quản lý gói và blockchain.
- SHA-384, 384 bit, 96 ký tự hex. Biến thể rút gọn của SHA-512, thường dùng trong TLS và trong hash của Subresource Integrity.
- SHA-512, 512 bit, 128 ký tự hex. Cùng họ với SHA-256 nhưng dùng phép toán nội bộ 64 bit, có thể nhanh hơn SHA-256 trên bộ xử lý 64 bit.
Nếu được chọn, hãy công bố và kiểm tra bằng SHA-256. MD5 và SHA-1 chỉ chấp nhận được để phát hiện hỏng hóc ngẫu nhiên, không phải giả mạo.
Có được hash khớp cho văn bản
Khi giá trị băm của bạn khác với của người khác cho "cùng" một văn bản, đầu vào gần như không bao giờ thực sự giống nhau. Những điều cần kiểm tra:
- Ký tự xuống dòng ở cuối.
echo hello | sha256sumbămhellokèm một ký tự xuống dòng. Ô văn bản ở đây băm chính xác những gì bạn gõ, nên kết quả sẽ khác trừ khi bạn thêm một dòng mới ở cuối. Trên dòng lệnh,echo -nhoặcprintftránh được ký tự thừa. - Kiểu kết thúc dòng. Windows dùng CR LF, Linux và macOS dùng LF. Văn bản nhiều dòng được dán vào có thể đổi kiểu kết thúc dòng tùy theo nguồn.
- Bảng mã. Văn bản được chuyển sang UTF-8 trước khi băm. Một hệ thống băm byte Latin-1 hoặc UTF-16 sẽ ra kết quả khác với bất cứ thứ gì ngoài ASCII thuần, chẳng hạn chữ tiếng Việt có dấu.
- Ký tự vô hình. Dấu cách không ngắt và ký tự độ rộng bằng không sao chép từ trang web hoặc PDF trông giống hệt trên màn hình.
- Chữ hoa hay thường trong hex. Giá trị băm được hiển thị bằng chữ thường.
A3F…vàa3f…là cùng một giá trị; hãy so sánh không phân biệt hoa thường.
Băm tệp và kiểm tra checksum
Băm tệp… đọc tệp đã chọn ngay trên máy và tính cả năm giá trị băm từ chính xác các byte của nó. Tên tệp và ngày không ảnh hưởng đến kết quả, chỉ có nội dung. Họ SHA dùng triển khai Web Crypto tích hợp của trình duyệt; MD5 được tính bằng một thư viện JavaScript nhỏ vì trình duyệt không cung cấp nó.
Để kiểm tra tệp tải về, hãy mở trang checksum của nhà phát hành, tìm dòng cho tệp của bạn và so sánh với hàng tương ứng ở đây. So sánh sáu hoặc tám ký tự đầu và cuối là cách kiểm tra nhanh; để bảo mật thật sự, hãy so sánh toàn bộ chuỗi. Nếu giá trị khác nhau, hãy tải lại tệp trước khi nghĩ đến giả mạo, vì một lần tải bị gián đoạn là lý do khả dĩ nhất.
Toàn bộ tệp được nạp vào bộ nhớ trước khi băm, nên tệp rất lớn, nhất là vài gigabyte trên điện thoại, có thể chậm hoặc thất bại. Không có gì được tải lên.
Hash không phải là gì
Một hash đơn thuần không phải là cách lưu mật khẩu. MD5 và họ SHA được thiết kế để chạy nhanh, điều cho phép kẻ tấn công thử hàng tỷ lần đoán mỗi giây với một giá trị băm bị rò rỉ. Lưu trữ mật khẩu cần một hàm cố ý chậm kèm salt, như bcrypt, scrypt hoặc Argon2. Nếu bạn chỉ cần một chuỗi bí mật mạnh, hãy dùng tạo mật khẩu.
Hash cũng không phải là mã hóa. Nó chỉ có một chiều: không có khóa nào để lấy lại bản gốc.