Hash (Hàm băm) là gì?
Hash function (Hàm băm) là một thuật toán toán học xác định (deterministic) nhận đầu vào (input/message) có độ dài tùy ý và tạo ra đầu ra (output/hash value/digest/checksum) có độ dài cố định (fixed-length), thường được biểu diễn dưới dạng chuỗi hexadecimal.
Ví dụ: SHA-256("Hello World") = a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e (64 ký tự hex = 256 bits).
Đặc tính cốt lõi (Cryptographic Hash Properties)
| Đặc tính | Giải thích | Tầm quan trọng |
|---|---|---|
| Deterministic (Xác định) | Cùng input → Luôn cùng output. | Xác minh tính toàn vẹn (Integrity verification). |
| Quick Computation (Tính toán nhanh) | Hash lớn dữ liệu trong milliseconds. | Hiệu năng thực tế (TLS, Git, Blockchain, Password storage). |
| Pre-image Resistance (Kháng nguyên ảnh - One-way) | Khó khăn tính toán ngược: Từ hash h → Tìm input x sao cho H(x)=h. Không thể "giải mã" hash. | Lưu trữ mật khẩu an toàn. Không khôi phục được pass từ hash. |
| Second Pre-image Resistance (Kháng nguyên ảnh thứ 2) | Cho input x1, khó tìm x2 ≠ x1 sao cho H(x1)=H(x2). | Ngăn chặn thay thế file/certificate độc hại có cùng hash. |
| Collision Resistance (Kháng va chạm) | Khó tìm bất kỳ cặp x1 ≠ x2 nào sao cho H(x1)=H(x2). Birthday Attack: Cần ~2^(n/2) phép thử cho n-bit hash. | Chữ ký số, Certificate, Git, Blockchain. MD5/SHA-1 BỊ PHÁ (Collision found). |
| Avalanche Effect (Hiệu ứng tuyết rơi) | Thay đổi 1 bit input → Thay đổi ~50% bit output. | Đảm bảo sự khác biệt rõ rệt, ngăn chặn phân tích thống kê. |
Các thuật toán Hash phổ biến & Trạng thái bảo mật
| Thuật toán | Độ dài Output | Trạng thái | Ứng dụng điển hình / Lưu ý |
|---|---|---|---|
| MD5 (Message Digest 5) | 128-bit (32 hex) | ❌ BỊ PHÁ (Broken) - Collision practical (2004), Chosen-prefix collision (2009). Tốc độ nhanh. | KHÔNG DÙNG cho bảo mật (cert, password, signature). Chỉ dùng: Checksum file non-security (error detection), legacy interop. |
| SHA-1 (Secure Hash Algorithm 1) | 160-bit (40 hex) | ❌ BỊ PHÁ (Broken) - SHAttered collision (2017, Google). Deprecated by NIST, Browser, CA/B Forum. | KHÔNG DÙNG cho bảo mật. Chỉ legacy: Git (đang chuyển SHA-256), một số cert cũ đã hết hạn. |
| SHA-2 Family (FIPS 180-4) | SHA-224, SHA-256, SHA-384, SHA-512, SHA-512/224, SHA-512/256 | ✅ AN TOÀN (Secure) - Không collision attack thực tế. Chuẩn NIST, TLS 1.2/1.3, Cert, Bitcoin, Password hashing (với salt/iteration). | TIÊU CHUẨN HIỆN NAY. SHA-256 phổ biến nhất. SHA-384/512 cho bảo mật cao hơn/hiệu năng 64-bit. |
| SHA-3 Family (Keccak, FIPS 202) | SHA3-224, SHA3-256, SHA3-384, SHA3-512, SHAKE128, SHAKE256 (XOF) | ✅ AN TOÀN (Secure) - Cấu trúc Sponge khác SHA-2. Dự phòng nếu SHA-2 bị phá. Hiệu năng phần mềm chậm hơn SHA-2 (nhanh trên hardware dedicated). | Tiêu chuẩn mới, bắt đầu được áp dụng (TLS 1.3, Ethereum 2.0, các protocol mới). SHAKE cho output độ dài tùy ý (XOF). |
| BLAKE2 / BLAKE3 | BLAKE2b (512), BLAKE2s (256), BLAKE3 (256, parallelizable) | ✅ AN TOÀN, HIỆU SUẤT CAO - Nhanh hơn MD5/SHA-1/SHA-2/3 trên software. BLAKE3 song song cực nhanh. | Thay thế MD5/SHA-1 cho non-crypto checksum (file integrity, deduplication). BLAKE2 dùng trong WireGuard, Argon2, Restic, BorgBackup. Chưa chuẩn hóa NIST FIPS cho federal US. |
| RIPEMD-160 | 160-bit | ⚠️ CŨ, KHÔNG KHUYẾN NGHỊ MỚI - Dùng trong Bitcoin Address (SHA-256 + RIPEMD-160). Không collision attack công khai nhưng thiết kế cũ. | Legacy Bitcoin/Blockchain. |
Ứng dụng chính trong An ninh mạng
1. Lưu trữ Mật khẩu (Password Hashing) - QUAN TRỌNG NHẤT
KHÔNG BAO GIỜ dùng SHA-256/SHA-512/MD5/SHA-1 trực tiếp cho password! Chúng quá nhanh → Dễ brute-force (GPU/ASIC hàng tỷ hash/giây).
Phải dùng Password Hashing Functions (PHF) / Key Derivation Functions (KDF) - Chậm, Memory-hard, Salted:
- Argon2id (Winner PHC 2015) - Tiêu chuẩn vàng hiện nay. Tham số: time_cost, memory_cost, parallelism. Dùng
libsodium,argon2lib. - scrypt - Memory-hard, dùng trong Litecoin, Tarsnap. Tham số: N, r, p.
- bcrypt - Dựa trên Blowfish, work factor (cost). Phổ biến, an toàn, nhưng không memory-hard như Argon2/scrypt. Giới hạn 72 bytes input.
- PBKDF2 (HMAC-SHA-256/512) - Chỉ CPU-hard, không memory-hard. Cần iterations cao (>600k OWASP 2024). Dùng cho FIPS compliance.
Quy trình: `Stored = Algorithm(Salt + Password, Params) || Salt || Params`. Verify: `Compute(Stored_Salt + Input_Pass, Stored_Params) == Stored_Hash`.
2. Kiểm tra Toàn vẹn Dữ liệu (Data Integrity)
- File download: SHA-256 checksum (Linux ISO, Software release).
- Git: SHA-1 (đang chuyển SHA-256) cho commit/tree/blob.
- Package Manager: npm (SHA-512), PyPI (SHA-256), Docker (SHA-256), apt (SHA-256).
- FIM (File Integrity Monitoring): Tripwire, AIDE, Wazuh, OSSEC hash critical system files.
- Blockchain: Bitcoin (Double SHA-256), Ethereum (Keccak-256). Merkle Tree root hash.
3. Chữ ký Số (Digital Signatures) & PKI
- Hash message → Ký hash bằng Private Key (RSA/ECDSA/EdDSA).
- X.509 Certificates: Hash (SHA-256) của TBSCertificate được ký bởi CA.
- Code Signing: Hash file/executable → Ký.
- Document Signing: PAdES, CAdES, XAdES.
4. TLS/SSL & Network Protocols
- TLS 1.2/1.3: PRF (Pseudo-Random Function) dựa trên HMAC-SHA-256/384. Key Derivation, Finished message verification.
- Certificate Transparency: Merkle Tree với SHA-256.
- IPSec/IKEv2: PRF (HMAC-SHA-256/384/512), Integrity (HMAC-SHA-256).
- SSH: Key Exchange (KDF), Integrity (HMAC-SHA-256/512).
5. MAC (Message Authentication Code) - HMAC & KMAC
- HMAC (RFC 2104): `HMAC(K, m) = H((K' ⊕ opad) || H((K' ⊕ ipad) || m))`. Chứng thực tính toàn vẹn & nguồn gốc (cần shared secret key). Dùng: API Auth (AWS SigV4, JWT HS256), TLS, IPsec, SSH.
- KMAC (SHA-3 based): `KMAC(K, X, L, S)`. Built-in keyed mode của SHA-3 (Keccak). Đơn giản, an toàn hơn HMAC.
6. KDF (Key Derivation Functions) - Không phải Password Hashing
- HKDF (HMAC-based KDF - RFC 5869): Extract-then-Expand. Dùng trong TLS 1.3, Signal Protocol, Age encryption, JWT. Input: IKM (Input Key Material), Salt, Info.
- PBKDF2: Cũng dùng làm KDF (derive key từ password cho encryption).
7. Các ứng dụng đặc thù khác
- Bloom Filters / Cuckoo Filters: Probabilistic data structures dùng hash cho membership test (Cert Revocation, Malware URL DB).
- Consistent Hashing: Phân phối load (Memcached, Redis Cluster, DynamoDB, Cassandra, Load Balancer).
- Proof of Work: Bitcoin (Double SHA-256 < target), Hashcash.
- Commitment Schemes: `Commit(m, r) = H(m || r)`. Reveal sau: public m, r.
- Verifiable Random Functions (VRF): Hash-based (ECVRF) cho Random Beacon, Leader Election (Algorand, Cardano).
Best Practices & Common Mistakes
| ✅ DO (Nên làm) | ❌ DON'T (Không nên làm) |
|---|---|
| Dùng SHA-256/384/512, SHA3-256/384/512, BLAKE2/3 cho integrity, signature, KDF, blockchain. | Dùng MD5, SHA-1, RIPEMD-160 cho bất kỳ mục đích bảo mật nào (cert, signature, password, integrity check quan trọng). |
| Dùng Argon2id, scrypt, bcrypt, PBKDF2-HMAC-SHA256 (với params mạnh) cho Password Hashing. | Dùng Fast Hash (SHA-256, MD5...) trực tiếp cho Password. Không salt. Salt ngắn/fix cứng. Iteration thấp. |
| Luôn dùng Salt ngẫu nhiên, duy nhất, đủ dài (≥16 bytes) cho mỗi password/hash mục đích. | Hardcode salt, dùng username làm salt, không salt. |
| Dùng HMAC-SHA256/512 hoặc KMAC cho Message Authentication (API, Token, Inter-service). | Dùng `H(secret || message)` hoặc `H(message || secret)` (Length Extension Attack trên SHA-2/Merkle-Damgård). |
| Kiểm tra Constant-time comparison khi verify hash/MAC (tránh Timing Attack). | Dùng `==` hoặc `strcmp` trực tiếp trên hash/MAC string/bytes. |
| Cập nhật thuật toán theo NIST SP 800-107 Rev. 1, 800-131A Rev. 2 (Transition dates). | Dùng thuật toán deprecated (SHA-1 cho cert, 3DES, RSA-1024). |
| Sử dụng thư viện crypto chuẩn, được duyệt (OpenSSL, BoringSSL, libsodium, Go crypto, Java JCA, .NET System.Security.Cryptography, Python cryptography/hazmat). | Viết crypto/hash thủ công (Roll your own crypto). |
Kết luận
Hash là cơ sở vô hình nhưng vững chắc của an ninh mạng hiện đại: Từ mật khẩu (Argon2id), chữ ký số (SHA-256 + RSA/ECDSA), TLS (HMAC-SHA256), Blockchain (SHA-256/Keccak), đến kiểm tra toàn vẹn file (SHA-256/BLAKE3). Hiểu đúng đặc tính, chọn đúng thuật toán cho đúng mục đích (Password Hashing ≠ General Hashing ≠ KDF ≠ MAC), và dùng thư viện chuẩn là chìa khóa. MD5/SHA-1 đã "chết" cho bảo mật - hãy loại bỏ hoàn toàn khỏi hệ thống mới và lên kế hoạch migrate hệ thống cũ.