Tiếng Việt dùng nhiều dấu thanh và dấu phụ (huyền, sắc, hỏi, ngã, nặng, dấu mũ, dấu móc) được biểu diễn trong Unicode theo hai cách: một ký tự dựng sẵn đã ghép dấu (NFC), hoặc chữ cái gốc cộng dấu kết hợp riêng (NFD). Cùng một chữ "Việt" có thể là hai chuỗi byte hoàn toàn khác nhau tùy vào hệ thống tạo ra nó, dù nhìn trên màn hình chúng giống hệt nhau — và vì vậy hai chuỗi "giống nhau" này sẽ cho ra hai hash khác nhau.
Vì sao điều này gây bất ngờ khi hash văn bản tiếng Việt
Bản thân thuật toán băm không có lỗi — nó chỉ đơn giản nhìn thấy các byte khác nhau và tạo ra kết quả khác nhau tương ứng. Vấn đề thực sự nằm ở bước trước đó: khi cần so sánh hoặc băm văn bản tiếng Việt lấy từ nhiều nguồn khác nhau (dán từ web, từ ứng dụng, từ file Word), nên chuẩn hóa Unicode về một dạng thống nhất trước, nếu không hai chuỗi giống hệt nhau về hình thức sẽ bị coi là khác nhau.
Vì sao MD5 và SHA-1 bị coi là không an toàn
Với cả hai thuật toán, người ta đã tìm ra cách thực tế để tạo hai bộ dữ liệu khác nhau có cùng một hash — gọi là va chạm (collision). Điều này khiến chúng không phù hợp ở những nơi cần độ bền vững mật mã học, dù vẫn được dùng ở những nơi chỉ cần kiểm tra tính toàn vẹn nhanh.
SHA-256 và họ SHA-2
SHA-256 tạo ra một hash 256 bit và cho đến nay chưa có va chạm thực tế nào được biết đến. Nó được dùng trong blockchain, chứng chỉ TLS và kiểm tra tính toàn vẹn phần mềm.
Vì sao cần điều này
- Kiểm tra tính toàn vẹn của tệp đã tải xuống bằng cách so sánh với hash đã công bố.
- Hiểu vì sao cùng một chuỗi tiếng Việt lấy từ hai nguồn khác nhau có thể cho ra hai hash khác nhau.
- Tạo dấu vân tay ngắn, duy nhất cho lượng dữ liệu lớn.
Vì sao SHA-3 không thay thế SHA-2
SHA-3 được chọn là người chiến thắng của một cuộc thi riêng do NIST tổ chức, phòng trường hợp SHA-2 một ngày nào đó bị phát hiện có lỗ hổng nền tảng — đây là một "bảo hiểm" dựa trên cấu trúc nội tại hoàn toàn khác (Keccak). Vì cho đến nay chưa tìm thấy cuộc tấn công thực tế nào vào SHA-2, SHA-256 vẫn là tiêu chuẩn mặc định trong hầu hết các hệ thống.