Hash ≠ mã hóa: SHA-256 checksum vs băm mật khẩu (và vì sao MD5 không dùng được)

(Cập nhật: 19 tháng 7, 2026 ) hash SHA-256 mã hóa MD5 checksum bảo mật mật khẩu
Kết luận

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:

  1. “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.
  2. “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

Hash và encryption khác nhau ở đâu
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

SHA-256
SHA-384
SHA-512

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

MD5 vs SHA-256 theo mục đích
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 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:

  1. Download HTTPS từ domain chính vendor (cẩn thận domain giả).
  2. Copy checksum từ cùng phiên / release note đã ký — không tin paste group chat.
  3. Hash local — tránh upload binary proprietary lên site “hash online” lạ.
  4. Nếu có GPG / Sigstore / chữ ký package manager → verify thêm.
  5. 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ỗiHiện tượng
Hash nhầm filePage ghi digest .tar.gz, bạn hash .zip
CRLF vs LFCùng text nhìn giống, digest khác giữa Windows/Unix
Encoding tiếng ViệtUTF-8 vs encoding khác → digest khác — luôn thống nhất UTF-8 trong API
Cắt hexSo 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ầuChọn
Ẩn PII, sau này đọc lạiAES-GCM (hoặc KMS) — encryption
Mật khẩu đăng nhậpArgon2id / bcrypt
Verify file downloadSHA-256 (+ chữ ký nếu cần)
Fixture test / so digest chuỗiSHA-256 local tool
Protocol cũ bắt MD5MD5 chỉ compatibility — ghi chú nợ kỹ thuật

Cách dùng công cụ hash trên Kawa

  1. Mở Tạo mã băm (Hash)
  2. Dán text / token cần đối chiếu (che secret production nếu share màn hình)
  3. Sao chép SHA-256 (hoặc SHA-512 tùy tool hiển thị)
  4. 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 digestverify 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.

Liên kết liên quan