Tổng quan
| Thuộc tính | SHA-1 | SHA-2 (256/384/512) | SHA-3 (Keccak) | MD5 |
|---|---|---|---|---|
| Độ dài đầu ra | 160-bit | 256/384/512-bit | 224/256/384/512-bit | 128-bit |
| Thiết kế | Merkle-Damgård | Merkle-Damgård | Sponge (Keccak-f[1600]) | Merkle-Damgård |
| Số vòng | 80 | 64/80 | 24 (permutation) | 64 |
| Trạng thái bảo mật | Đã phá vỡ (collision 2017) | An toàn (không collision thực tế) | An toàn (thiết kế khác biệt) | Đã phá vỡ (collision 2004) |
| Tốc độ (CPU hiện đại) | ~0.5 cpb | ~0.5-1 cpb | ~1-2 cpb (phần mềm) | ~0.3 cpb (nhanh nhất) |
| Khuyến nghị NIST | Chỉ dùng legacy (HMAC-SHA1 chấp nhận được) | Tiêu chuẩn hiện tại (FIPS 180-4) | Tiêu chuẩn bổ sung (FIPS 202) | Cấm dùng cho mật mã |
Chi tiết MD5
- Ron Rivest, 1991. Thay thế MD4.
- Collision thực tế: 2004 (Wang), 2008 (chosen-prefix), 2012 (Flame malware dùng MD5 collision giả chứng chỉ Microsoft).
- Preimage: vẫn ~2¹²³ (không thực tế), nhưng collision đủ hủy hoại chữ ký số, certificate.
- Vẫn dùng: checksum tệp (non-security), hash table, deduplication, git (commit ID - đang chuyển SHA-256).
Chi tiết SHA-1
- NIST/NSA, 1995 (FIPS 180-1).
- Collision thực tế: SHAttered (Google/CWI, 2017) — 2⁶³.¹ operations, 110 GPU-year.
- Cấm: TLS certificate (2017), Git (chuyển SHA-256), code signing.
- HMAC-SHA1: Vẫn chấp nhận được (HMAC bảo vệ collision), nhưng nên chuyển HMAC-SHA256.
SHA-2 Family (Tiêu chuẩn vàng hiện tại)
- SHA-224, SHA-256, SHA-384, SHA-512, SHA-512/224, SHA-512/256.
- SHA-256: 32-bit word, 64 vòng. SHA-512: 64-bit word, 80 vòng.
- Hỗ trợ phần cứng: Intel SHA extensions, ARMv8 SHA.
- Dùng cho: TLS 1.2/1.3, Bitcoin (SHA-256d), certificate, JWT (RS256/ES256), HKDF.
SHA-3 (Keccak) — Thiết kế dự phòng
- NIST SHA-3 competition winner (2012). Sponge construction: absorb → squeeze.
- Không dùng Merkle-Damgård → tránh length extension attack tự nhiên.
- SHAKE128/256 (XOF - extendable output function).
- Dùng khi: cần đa dạng thuật toán (cryptographic agility), XOF, hoặc chống side-channel tốt hơn (permutation-based).
Khuyến nghị thực tế (2024)
- Mặc định: SHA-256 (hoặc SHA-512 trên 64-bit).
- Cần XOF / domain separation dễ dàng: SHAKE256 (SHA-3).
- Chống length extension không dùng HMAC: SHA-3 hoặc SHA-512/256 (truncated).
- Tuyệt đối không dùng: MD5, SHA-1 cho chữ ký số, certificate, MAC, password hashing, blockchain mới.
- Password hashing: Không dùng SHA/MD5 trực tiếp. Dùng Argon2id, bcrypt, scrypt, PBKDF2-HMAC-SHA256.