Năm nào cũng có vài vụ lộ dữ liệu, hàng triệu tài khoản bị tung lên mạng. Nhưng để ý kỹ, thứ bị lộ thường không phải mật khẩu gốc của bạn — mà là một dãy ký tự dài ngoằng, nhìn như ai đó gõ bừa lên bàn phím. Đó là “bản băm” của mật khẩu.
Băm (hash) hiểu nôm na giống xay thịt: miếng thịt qua máy xay thành thịt băm, nhưng chẳng ai ghép đống thịt băm ấy trở lại thành miếng thịt ban đầu được. Dữ liệu cũng vậy. Bạn thử gõ chữ “abc” vào một công cụ băm mà xem — MD5 cho ra dãy 32 ký tự 900150983cd24fb0d6963f7d28e17f72. Các website làm y hệt thế với mật khẩu của bạn: chỉ lưu dãy ký tự kia, không lưu mật khẩu thật.
Vậy lúc đăng nhập, web lấy gì ra đối chiếu nếu nó không hề giữ mật khẩu của bạn? Và vì sao hacker ôm cả kho dữ liệu băm mà vẫn phải ngồi đoán mò từng mật khẩu một?
Băm một chiều: dễ làm, khó đảo ngược
Tính chất cốt lõi của hash là một chiều. Cùng một đầu vào, băm lúc nào cũng ra cùng một kết quả — nhưng từ kết quả đó, không có đường quay ngược về đầu vào. Trang DFF ví von quá trình này giống trộn sữa vào cà phê: khuấy thì dễ, chứ tách sữa ra khỏi cà phê thì không ai làm được.
Bạn có thể hình dung hàm băm như một cái máy xay chỉ chạy đúng một chiều. Thịt sống đi vào, thịt băm đi ra. Máy không có nút “ráp lại”. Với dữ liệu số, “cái máy” đó là một thuật toán toán học trộn các bit lại với nhau hàng nghìn vòng, đến khi không còn nhận ra hình dạng ban đầu.

Mã băm: dấu vân tay của dữ liệu
Mỗi thuật toán băm cho ra kết quả có độ dài cố định, bất kể đầu vào dài hay ngắn. MD5 luôn ra 32 ký tự hex, SHA-1 ra 40 ký tự, SHA-256 ra 64 ký tự, SHA-512 ra 128 ký tự. Gõ một chữ “a” hay dán cả một cuốn tiểu thuyết vào, độ dài kết quả vẫn thế.
Một tính chất hay ho khác: chỉ cần đổi một ký tự trong đầu vào, bản băm đã khác hoàn toàn. Mình thử băm hai chuỗi chỉ khác nhau một chữ cái:
- MD5 của
abc=900150983cd24fb0d6963f7d28e17f72 - MD5 của
abd=4911e516e5aa21d327512e0c8b197616
Không còn chút gì giống nhau. Nhờ tính nhạy cảm này, mã băm được dùng như “dấu vân tay” của dữ liệu. Một ứng dụng bạn có thể gặp: khi tải phần mềm từ nguồn không chính thức, trang chủ phần mềm thường công bố mã băm (checksum) của file. Bạn băm file vừa tải về, so hai dãy ký tự — khớp nhau thì file nguyên vẹn, khác nhau thì file đã bị can thiệp.

Thử thật: băm “abc” bằng công cụ của Công Cụ Việt
Nói thì hay, nhưng mình muốn bạn tự tay thử một lần cho nhớ. Mở công cụ băm chuỗi văn bản của Công Cụ Việt, gõ abc vào ô nhập — bốn kết quả hiện ra ngay, không cần bấm nút:
- MD5:
900150983cd24fb0d6963f7d28e17f72 - SHA-1:
a9993e364706816aba3e25717850c26c9cd0d89d - SHA-256:
ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad - SHA-512:
ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f
Sáng nay mình đã dùng thử thật trên công cụ và ghi lại đúng từng ký tự — dãy MD5 này cũng chính là test vector chuẩn trong tài liệu RFC 1321, nên bạn hoàn toàn có thể dùng nó để kiểm tra bất kỳ công cụ băm nào khác. Trên giao diện còn có nút sao chép riêng cho từng ô, tùy chọn viết hoa mã băm và nút xóa trắng, khá tiện khi cần lấy nhanh một mã để đối chiếu.
Một lưu ý nhỏ mà trang công cụ cũng nhắc: công cụ này chỉ băm văn bản để đối chiếu, không có salt, nên đừng nhập mật khẩu thật hay dữ liệu nhạy cảm vào đây — phần dành cho mật khẩu nằm ở công cụ bcrypt bên dưới.
MD5, SHA-256 và bcrypt: mỗi người một việc
Ba cái tên này hay bị nhắc chung một chỗ, nhưng chúng sinh ra cho những việc khác nhau.
MD5 là thuật toán đời đầu, xuất hiện từ đầu thập niên 1990. Nó rất nhanh — và chính cái nhanh đó lại là vấn đề khi dùng để lưu mật khẩu: máy tính hiện nay thử được hàng tỷ mật khẩu mỗi giây qua MD5. Chưa kể người ta đã chứng minh được cách tạo ra hai dữ liệu khác nhau nhưng cùng một mã MD5 (va chạm), nên MD5 không còn phù hợp cho những việc đòi hỏi chống giả mạo. Nói thẳng: đừng dùng MD5 để lưu mật khẩu nữa.
SHA-256 thuộc họ SHA-2, dài gấp đôi MD5 và đến nay vẫn được coi là an toàn cho kiểm tra toàn vẹn dữ liệu. Bitcoin dùng SHA-256, các trang phần mềm công bố checksum SHA-256 cho file tải về. Nhưng SHA-256 vẫn là hàm băm “nhanh” theo thiết kế — nhanh thì tốt cho kiểm tra file, nhưng vẫn chưa đủ chậm để làm khó kẻ đoán mật khẩu.
bcrypt thì ngược lại hoàn toàn: nó được thiết kế để chậm một cách có chủ đích. Hai nhà nghiên cứu Niels Provos và David Mazières giới thiệu bcrypt năm 1999 với một ý tưởng đơn giản mà hiệu quả — mỗi lần băm, thuật toán tự sinh một chuỗi ngẫu nhiên gọi là salt rồi trộn vào mật khẩu. Nhờ salt, cùng một mật khẩu nhưng băm hai lần cho hai chuỗi khác nhau, khiến những bảng băm tính sẵn (rainbow table) của hacker trở nên vô dụng. Ngoài ra bcrypt còn có tham số cost: tăng cost lên 1 đơn vị, lượng công việc tính toán tăng xấp xỉ gấp đôi — máy tính càng mạnh, người ta càng tăng cost để giữ độ khó.
Mình băm thử một mật khẩu demo ConGcuviet2026! trên công cụ băm mật khẩu bcrypt của Công Cụ Việt với cost mặc định là 10, nhận được chuỗi:
$2a$10$XvAbCAVQfiwEIV6Du5j7Qe9HH1WoJScndwd6lW6CL7cTTubcKOx8S
Chuỗi này gom cả phiên bản, cost, salt và phần băm vào một — bạn bấm lại lần nữa sẽ thấy chuỗi khác hẳn, dù mật khẩu nhập vào y hệt. Công cụ còn tự điền kết quả sang phần kiểm tra; mình bấm “KIỂM TRA KHỚP” và nó báo TRÙNG KHỚP, đúng như cách website xác thực bạn mỗi lần đăng nhập.
Website đăng nhập thế nào khi không giữ mật khẩu thật?
Đây là câu hỏi nhiều bạn thắc mắc nhất, mà câu trả lời lại rất gọn. Website không cần biết mật khẩu gốc của bạn. Lúc bạn đăng ký, nó băm mật khẩu rồi cất bản băm đi. Lúc bạn đăng nhập, nó băm đúng mật khẩu bạn vừa gõ, rồi so hai bản băm với nhau. Khớp thì cho vào, không khớp thì báo sai.
Không cần giải mã. Không cần bản gốc. Chỉ cần so sánh.
“Không giải mã được” khác “không đoán được”
Đến đây cần nói rõ một hiểu lầm phổ biến: không giải mã được không có nghĩa là không ai tìm ra mật khẩu của bạn. Hacker không cần “giải mã” — họ đoán. Họ lấy một danh sách hàng triệu mật khẩu phổ biến (123456, password, ngày sinh…), băm sẵn từng cái bằng MD5 rồi tra ngược. Với mật khẩu yếu, cả quá trình chỉ mất vài giây.
Đó là lý do salt của bcrypt quan trọng: nó phá tan mọi bảng tính sẵn, buộc hacker phải đoán từng mật khẩu một cách chậm chạp. Và cũng là lý do bạn nên đặt mật khẩu đủ mạnh trước khi nghĩ đến chuyện băm — bạn có thể kiểm tra nhanh bằng công cụ kiểm tra độ mạnh mật khẩu. Nhân tiện, đừng nhầm băm với mã hóa: mã hóa văn bản thì giải mã được bằng khóa, còn băm thì không có đường về.
Một vài câu hỏi thường gặp
Mã băm có giải mã được không?
Không. Không có thuật toán “giải băm”. Cách duy nhất để tìm ra chuỗi gốc là đoán: băm thử từng khả năng rồi so sánh. Mật khẩu càng mạnh, càng khó đoán.
Vì sao website không lưu luôn mật khẩu thật cho tiện?
Vì không cần, và vì lưu mật khẩu thật là tự tạo rủi ro. Chỉ cần bản băm là đủ để xác thực, lại tránh được thảm họa khi cơ sở dữ liệu bị lộ.
Băm mật khẩu thật trên công cụ online có an toàn không?
Không nên. Muốn học cách hoạt động của bcrypt, hãy dùng mật khẩu demo như mình làm ở trên. Mật khẩu thật chỉ nên được băm bên trong hệ thống của chính website đó.
Lần tới thấy tin “lộ cơ sở dữ liệu”, bạn cứ kiểm tra một thứ: thứ bị lộ là mật khẩu gốc hay bản băm? Nếu là bản băm bcrypt, cứ bình tĩnh đổi mật khẩu là xong. Còn nếu là mật khẩu gốc — đổi ngay, và đừng dùng lại mật khẩu đó ở bất kỳ đâu nữa.

