Mã hóa đối xứng (Symmetric Encryption) là gì?
Mã hóa đối xứng (Symmetric Encryption / Secret Key Encryption) là phương pháp mật mã học sử dụng một khóa duy nhất (secret key) cho cả hai quá trình mã hóa (encryption) và giải mã (decryption). Cả người gửi và người nhận phải nắm giữ cùng một khóa bí mật này.
Nguyên lý hoạt động
Plaintext + Key + Algorithm → Ciphertext
Ciphertext + Key + Algorithm → Plaintext
- Khóa bí mật (Secret Key): Chuỗi bit ngẫu nhiên (128-bit, 192-bit, 256-bit).
- Thuật toán: AES, ChaCha20, 3DES (đã lỗi thời), v.v.
- Chế độ hoạt động (Mode of Operation): ECB (không an toàn), CBC, CTR, GCM (khuyên dùng - cung cấp AEAD).
Các thuật toán đối xứng phổ biến
| Thuật toán | Kích thước khóa | Kích thước block | Trạng thái | Ứng dụng điển hình |
|---|---|---|---|---|
| AES (Advanced Encryption Standard) | 128, 192, 256-bit | 128-bit | Tiêu chuẩn vàng, an toàn | TLS 1.2/1.3, VPN, Disk encryption (BitLocker, FileVault, LUKS), ZIP/7z, SSH |
| ChaCha20 | 256-bit | Stream (512-bit block) | An toàn, nhanh trên CPU không có AES-NI | TLS 1.3, WireGuard, SSH, QUIC, WireGuard |
| AES-GCM / ChaCha20-Poly1305 | 128/256-bit | 128-bit / Stream | AEAD (Authenticated Encryption) | TLS 1.2/1.3, IPsec, SRTP, Kubernetes secrets |
| 3DES (Triple DES) | 168-bit (effect 112-bit) | 64-bit | Đã ngừng dùng (Deprecated) - Sweet32 attack, chậm | Hệ thống legacy, PCI-DSS cũ (bắt buộc loại bỏ) |
| RC4 | 40-2048-bit | Stream | Phá vỡ hoàn toàn (Broken) | Cấm dùng (TLS, WPA, PDF) |
| Blowfish/Twofish | 32-448-bit / 128-256-bit | 64-bit / 128-bit | Không khuyến nghị cho hệ mới | Một số phần mềm cũ (OpenVPN legacy, bcrypt dùng Blowfish) |
So sánh: Đối xứng vs Bất đối xứng (Asymmetric)
| Tiêu chí | Mã hóa đối xứng | Mã hóa bất đối xứng (RSA, ECC, ElGamal) |
|---|---|---|
| Số khóa | 1 khóa chung (shared secret) | Cặp khóa: Public Key (mã hóa) + Private Key (giải mã) |
| Tốc độ | Rất nhanh (GB/s trên CPU hiện đại) | Chậm (KB-MB/s), tốn tài nguyên CPU |
| Kích thước khóa tương đương an toàn | AES-128 ≈ RSA-3072 ≈ ECC-256 | RSA-2048 ≈ AES-112 (yếu), RSA-3072 ≈ AES-128 |
| Vấn đề chính | Trao đổi khóa an toàn (Key Exchange) | Hiệu năng, kích thước ciphertext lớn |
| Ứng dụng chính | Mã hóa dữ liệu lớn (bulk encryption) | Trao đổi khóa, chữ ký số, xác thực, PKI |
Kết hợp hai loại: Hybrid Encryption (Best Practice)
Hầu hết các hệ thống hiện đại (TLS, SSH, PGP, Signal, Age) dùng Kết hợp (Hybrid):
- Dùng bất đối xứng (ECDH, X25519, RSA-KEM) để trao đổi/khởi tạo khóa phiên (session key) an toàn.
- Dùng đối xứng (AES-GCM, ChaCha20-Poly1305) với khóa phiên để mã hóa dữ liệu thực tế.
TLS 1.3 Handshake:
ClientHello + Key Share (X25519) → ServerHello + Key Share → Shared Secret (ECDH)
→ HKDF-Extract/Expand → Traffic Keys (AES-256-GCM / ChaCha20-Poly1305)
→ Application Data encrypted with Symmetric Keys
Ví dụ thực tế
- HTTPS (TLS 1.3): ECDHE (key exchange) + AES-256-GCM / ChaCha20-Poly1305 (record encryption).
- VPN (WireGuard): Curve25519 (key exchange) + ChaCha20-Poly1305 (transport encryption).
- Mã hóa ổ đĩa (BitLocker/LUKS/FileVault): AES-XTS / AES-CBC + PBKDF2/Argon2 từ passphrase.
- Kubernetes Secrets: Envelope encryption: DEK (AES-GCM) được mã hóa bằng KEK (KMS - Cloud KMS/HSM).
- SSH: Diffie-Hellman (key exchange) + AES-CTR / ChaCha20-Poly1305 (session encryption).
Thách thức & Best Practices
1. Trao đổi khóa (Key Distribution)
- Không bao giờ gửi khóa qua kênh không an toàn (email, chat, Git).
- Dùng: Diffie-Hellman (ECDHE/X25519), KEM, PAKE (SPAKE2, OPAQUE), hoặc kênh out-of-band (QR code, NFC).
2. Quản lý khóa (Key Management)
- Xoay khóa (Key Rotation) định kỳ: 90 ngày - 1 năm tùy mức độ rủi ro.
- Tách khóa theo mục đích: Khóa mã hóa dữ liệu (DEK) ≠ Khóa mã hóa khóa (KEK) ≠ Khóa ký (Signing Key).
- Lưu khóa trong HSM, Cloud KMS (AWS KMS, Azure Key Vault, GCP KMS, HashiCorp Vault).
3. Chế độ hoạt động (Mode) - Quan trọng!
- KHÔNG BAO GIỜ dùng ECB - lộ pattern dữ liệu.
- Dùng AES-GCM hoặc ChaCha20-Poly1305 (AEAD - cung cấp cả mã hóa và xác thực).
- Nếu buộc dùng CBC: phải dùng HMAC riêng (Encrypt-then-MAC) và IV ngẫu nhiên duy nhất mỗi lần mã hóa.
- Nonce/IV: Không bao giờ tái sử dụng (nonce reuse = catastrophic failure cho GCM/ChaCha20).
4. Kiểm tra toàn vẹn & Xác thực (Integrity & Authenticity)
Mã hóa đối xứng không tự động đảm bảo toàn vẹn (trừ AEAD). Luôn dùng AEAD hoặc kết hợp HMAC (Encrypt-then-MAC).