Hash ≠ mã hóa: SHA-256 checksum vs băm mật khẩu (và vì sao MD5 không dùng được)
Hash ≠ mã hóa. Mã hóa (AES, RSA) giải mã được bằng khóa — dùng khi cần lấy lại dữ liệu. Hash (SHA-256…) một chiều — cùng input → cùng digest, đổi 1 bit → digest khác. Checksum file / Git / nội dung: SHA-256. Mật khẩu: Argon2 hoặc bcrypt + salt — không MD5, không SHA-256 trần. Tra digest nhanh trên trình duyệt với công cụ hash Kawa (chạy local, không cần đăng ký).
Trong nhóm freelance / outsource Việt Nam, hai câu hay gây sự cố production:
- “Em đã mã hóa mật khẩu bằng SHA-256” — thực ra là hash, và thường sai cho lưu mật khẩu.
- “MD5 khớp là file an toàn” — MD5 bắt lỗi tải cụt đôi khi được, nhưng không đủ chống attacker chủ động.
Bài này tách rõ hash vs encryption, khi nào dùng SHA-256, vì sao MD5 không cho mật khẩu, và checklist verify download / debug chữ ký API — góc nhìn thực tế cho junior và tech lead review PR.
Bài viết này giúp bạn
- Phân biệt hash, encryption, password hashing chuyên dụng
- Biết SHA-256 phù hợp checksum, không thay TLS hay bcrypt
- Hiểu giới hạn MD5 năm 2026
- Có bảng so sánh + case study rò rỉ DB + lỗi copy-paste digest
- Dùng SHA-256 hash generator local để đối chiếu fixture
So sánh nhanh: hash vs mã hóa
| Tiêu chí | Hash (băm) | Mã hóa (encryption) |
|---|---|---|
| Đảo ngược | Không thực tế (một chiều) | Có — bằng khóa đúng |
| Cùng input | Luôn cùng digest | Ciphertext có thể khác nếu có IV/nonce |
| Mục đích chính | Toàn vẹn, so khớp, fingerprint | Bí mật khi lưu/truyền |
| Ví dụ thuật toán | SHA-256, SHA-512, (MD5 legacy) | AES-GCM, ChaCha20, RSA |
| Mật khẩu user | Chỉ qua Argon2/bcrypt (có cost + salt) | Không lưu mật khẩu bằng encryption có khóa chung trong DB |
| Dữ liệu cá nhân cần đọc lại | Không phù hợp | Mã hóa rồi giải mã khi authorized |
Quy tắc vàng: thông tin cá nhân / tài liệu cần mở lại → mã hóa. Mật khẩu đăng nhập → password hash chuyên dụng. File release → SHA-256 checksum (+ chữ ký nếu threat model cao).
Hash một chiều hoạt động thế nào
"hello" --SHA-256--> 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
"hello!" --SHA-256--> (digest hoàn toàn khác — avalanche)
Tính chất quan trọng:
- Deterministic: cùng bytes → cùng hex
- Một chiều: không có hàm
decrypt(hash) - Nhạy cảm bit: sửa 1 ký tự / CRLF vs LF → digest khác
Vì vậy hash dùng để so khớp (login: hash input rồi so với digest đã lưu; download: so với checksum công bố), không để giấu rồi lấy lại mật khẩu gốc.
Thử ngay trên trình duyệt (dữ liệu không gửi server):
🛡️ Tạo giá trị hash ngay tại đây
* Tự động tính toán khi nhập
Hoặc mở công cụ tạo mã băm SHA-256 / SHA-512, dán chuỗi fixture API, copy digest 64 ký tự hex.
SHA-256: mạnh cho checksum, yếu nếu dùng sai cho mật khẩu
Khi SHA-256 là lựa chọn đúng
- Verify installer / tarball theo checksum vendor
- Fingerprint nội dung (content addressing), object Git
- Debug chữ ký API: ghép canonical string rồi hash — đối chiếu “digest đúng” trước khi đổ lỗi vào HMAC
Khi SHA-256 (trần) là lựa chọn sai
SHA256(password)rồi lưu DB — quá nhanh, GPU crack hàng tỷ thử/giây nếu không có salt/cost chuyên dụng- Coi matching digest = “malware-free mãi mãi”
- Thay TLS hoặc mã hóa cột PII
Password hashing hiện đại (Argon2id, bcrypt, scrypt) cố ý chậm và tốn bộ nhớ — ngược với mục tiêu checksum.
MD5 năm 2026: legacy checksum thôi
| Mục đích | MD5 | SHA-256 |
|---|---|---|
| Phát hiện tải file cụt (vô tình) | Thường bắt được | Bắt được — nên dùng |
| Chống attacker tạo file giả cùng digest | Yếu — collision thực tế | Baseline hiện tại cho checksum công khai |
| Lưu mật khẩu | Không bao giờ | Không dùng trần — dùng Argon2/bcrypt |
| Chữ ký / TLS | Không | Không thay thế chữ ký số |
Tutorial cũ md5(password) trước INSERT vẫn lan trên blog và Stack Overflow — năm 2026 đó là malpractice. MD5 không “decrypt” được; attacker dùng rainbow table / brute-force, và collision khiến MD5 kém tin cậy khi có đối thủ.
Giữ MD5 chỉ khi protocol hoặc tài liệu cũ bắt buộc. Pipeline mới: publish SHA-256 (và chữ ký nếu có).
Case study 1: DB lộ — encryption vs hash mật khẩu
Giả định: App freelance lưu password_encrypted bằng AES với khóa nằm cùng server / cùng repo config. Attacker dump DB và lấy khóa → mọi mật khẩu khôi phục được.
Nếu lưu hash đúng cách (Argon2/bcrypt + salt riêng mỗi user): ngay cả admin cũng không đọc lại mật khẩu gốc; attacker phải offline crack từng hash — tốn kém với mật khẩu mạnh.
Nếu lưu MD5(password) hoặc SHA256(password) không salt: dump + rainbow table = thảm họa với mật khẩu yếu (rất phổ biến).
Takeaway cho review PR: thấy crypto.createHash('md5') hoặc sha256 trên password field → block và yêu cầu thư viện password hashing.
Case study 2: Checksum khớp nhưng vẫn cài nhầm
Dev tải tool-win.zip từ mirror forum, tự hash SHA-256 — khớp dòng MD5/SHA trên post forum.
Vấn đề: attacker đã sửa cả file lẫn dòng checksum trên cùng trang. Checksum chỉ nói “bytes trùng thứ được công bố trên kênh đó”.
Checklist kênh tin cậy:
- Download HTTPS từ domain chính vendor (cẩn thận domain giả).
- Copy checksum từ cùng phiên / release note đã ký — không tin paste group chat.
- Hash local — tránh upload binary proprietary lên site “hash online” lạ.
- Nếu có GPG / Sigstore / chữ ký package manager → verify thêm.
- CI:
sha256sum -c SHA256SUMSđể người không phải cổng duy nhất.
# Linux / macOS
sha256sum release.tar.gz
# Windows PowerShell
Get-FileHash .\release.tar.gz -Algorithm SHA256
So sánh không phân biệt hoa thường; SHA-256 = 64 ký tự hex đủ — đừng cắt ngắn khi copy.
Trên máy lab không cài CLI: dùng hash tool trên Kawa cho chuỗi / token ngắn. File installer lớn nên ưu tiên CLI Get-FileHash / sha256sum.
Lỗi tinh vi hay gặp
| Lỗi | Hiện tượng |
|---|---|
| Hash nhầm file | Page ghi digest .tar.gz, bạn hash .zip |
| CRLF vs LF | Cùng text nhìn giống, digest khác giữa Windows/Unix |
| Encoding tiếng Việt | UTF-8 vs encoding khác → digest khác — luôn thống nhất UTF-8 trong API |
| Cắt hex | So 60/64 ký tự → false mismatch hoặc false confidence |
| Nhầm “hash = mã hóa mật khẩu” trong tài liệu nội bộ | Junior ship SHA-256 trần |
Khi debug API signature: paste canonical string vào công cụ hash, lấy “digest chuẩn”, rồi so với output code — tách lỗi ghép chuỗi khỏi lỗi thuật toán.
Nên dùng gì — ma trận quyết định
| Nhu cầu | Chọn |
|---|---|
| Ẩn PII, sau này đọc lại | AES-GCM (hoặc KMS) — encryption |
| Mật khẩu đăng nhập | Argon2id / bcrypt |
| Verify file download | SHA-256 (+ chữ ký nếu cần) |
| Fixture test / so digest chuỗi | SHA-256 local tool |
| Protocol cũ bắt MD5 | MD5 chỉ compatibility — ghi chú nợ kỹ thuật |
Cách dùng công cụ hash trên Kawa
- Mở Tạo mã băm (Hash)
- Dán text / token cần đối chiếu (che secret production nếu share màn hình)
- Sao chép SHA-256 (hoặc SHA-512 tùy tool hiển thị)
- So với digest kỳ vọng trong spec / test
Chạy trong trình duyệt — phù hợp máy công ty khóa CLI hoặc khi chỉ cần hash chuỗi ngắn không muốn gửi lên service lạ.
Không dùng tool này thay Argon2 cho lưu mật khẩu production — chỉ để hiểu digest và verify toàn vẹn / debug.
Tóm tắt mang đi
- Hash = fingerprint một chiều; encryption = bí mật có thể mở lại.
- SHA-256 = chuẩn checksum hiện đại; không = password hasher.
- MD5 = legacy; cấm mật khẩu và integrity chống attacker.
- Checksum khớp = cùng bytes với publisher trên kênh đó — chưa đủ nếu trang bị chiếm.
- Bookmark hash local Kawa cho fixture và so digest nhanh.