Hai công cụ mật mã cơ bản, mục tiêu và thuộc tính hoàn toàn khác biệt.
Bảng so sánh cốt lõi
| Tiêu chí | Hashing (Hàm băm) | Encryption (Mã hóa) |
|---|---|---|
| Tính chất | Một chiều (One-way) — không đảo ngược | Hai chiều (Two-way) — có giải mã |
| Khóa | Không khóa (unkeyed) — hoặc keyed (HMAC) | Bắt buộc có khóa (Symmetric K hoặc Asymmetric PK/SK) |
| Đầu ra | Cố định độ dài (256-bit SHA-256...) | Cùng độ dài plaintext (+ padding, tag, IV) |
| Mục đích chính | Toàn vẹn (Integrity), Fingerprint, Commitment | Bảo mật (Confidentiality), Che giấu nội dung |
| Xác thực | Chỉ khi kết hợp khóa (HMAC) hoặc chữ ký số | Built-in (AEAD) hoặc kết hợp MAC |
| Non-repudiation | Chỉ với chữ ký số (ký hash) | Chỉ với chữ ký số (asymmetric) |
| Deterministic | Cùng input → cùng output (trừ salt/randomized hashing) | Probabilistic (cần IV/nonce random) → khác nhau mỗi lần |
| Ví dụ | SHA-256, SHA-3, BLAKE3, Argon2id (KDF) | AES-GCM, ChaCha20-Poly1305, RSA-OAEP, X25519 |
Khi nào dùng cái nào?
Dùng Hashing khi:
- Kiểm tra toàn vẹn tệp (checksum, git, blockchain, download verification).
- Lưu trữ mật khẩu → Password Hashing KDF (Argon2id, bcrypt) — không phải hash nhanh.
- Chữ ký số: Ký H(M) thay vì M.
- MAC: HMAC(K, M) = H((K⊕opad)||H((K⊕ipad)||M)).
- KDF: HKDF, PBKDF2 dẫn xuất khóa từ secret.
- Commitment scheme: Commit = H(r||m).
- Data structure: Hash table, Bloom filter, Merkle tree (non-crypto: xxHash, SipHash).
Dùng Encryption khi:
- Bảo vệ nội dung tin nhắn, tệp, database, disk — cần đọc lại sau.
- Truyền tải qua mạng không tin cậy (TLS, SSH, WireGuard, Signal).
- Key exchange (KEM): RSA-OAEP, ECIES, Kyber encapsulate symmetric key.
- Envelope encryption: DEK mã hóa data, KEK (trong KMS/HSM) mã hóa DEK.
- Searchable encryption / FHE (niche, nghiên cứu).
Kết hợp Hashing + Encryption (Best Practice)
- Encrypt-then-MAC (EtM): C = Enc(Kₑ, P); T = MAC(Kₘ, C); gửi (C, T). Verify T trước khi decrypt. An toàn nếu MAC strong.
- AEAD (Auth Encryption with Associated Data): AES-GCM, ChaCha20-Poly1305 — tích hợp enc + auth, chuẩn hóa, khuyên dùng nhất.
- Hybrid: KEM + DEM: KEM(PK) → K_sym; DEM(K_sym) → AEAD encrypt data.
- Digital Signature: Sign(SK, H(M)) — hash then sign.
Sai lầm thường gặp
- Dùng SHA-256 "mã hóa" mật khẩu → SAI (nhanh, không salt, rainbow table). Phải dùng Argon2id/bcrypt.
- Dùng AES-ECB → SAI (lộ pattern). Phải dùng AES-GCM/CTR+MAC.
- Dùng cùng IV/nonce cho nhiều lần mã hóa (CTR/GCM/ChaCha20) → PHÁ VỠ HOÀN TOÀN.
- Tự thiết kế protocol crypto → RỦI RO CAO. Dùng TLS 1.3, HPKE, Signal, age, libsodium, Tink.