Cơ chế Public Key Infrastructure (PKI) & Cặp khóa Asymmetric
Trong mật mã học khóa công khai (Asymmetric Cryptography), một cặp khóa bao gồm:
- Private Key (Khóa riêng): Giữ bí mật tuyệt đối, dùng để giải mã hoặc ký số.
- Public Key (Khóa công khai): Phân phát công khai, dùng để mã hóa hoặc xác thực chữ ký.
Hai khóa liên kết toán học: dữ liệu mã hóa bằng Public Key chỉ Private Key tương ứng mới giải mã được; chữ ký tạo bằng Private Key thì Public Key nào cũng xác thực được.
Quy trình sinh cặp khóa (Key Generation Process)
- Chọn thuật toán: RSA (2048/3072/4096-bit), ECC (ECDSA/EdDSA - curve P-256, P-384, Curve25519), Ed25519 (khuyến nghị hiện nay: nhanh, nhỏ, an toàn).
- Tạo số ngẫu nhiên an toàn (CSPRNG): Hệ điều hành cung cấp entropy source (
/dev/urandomLinux,BCryptGenRandomWindows,SecRandomCopyBytesmacOS/iOS). - Sinh Private Key:
- RSA: Chọn 2 số nguyên tố lớn p, q → tính n = p*q, φ(n), chọn e (thường 65537), tính d = e⁻¹ mod φ(n). Private key = (n, d) hoặc dạng CRT (p, q, dP, dQ, qInv).
- ECC/Ed25519: Chọn scalar ngẫu nhiên d trong khoảng [1, n-1] (n = order của base point). Private key = d.
- Tính Public Key từ Private Key:
- RSA: Public key = (n, e).
- ECC: Q = d * G (nhân scalar điểm cơ sở G trên đường cong elliptic). Public key = điểm Q (x, y).
- Mã hóa lưu trữ (Serialization):
- Private Key: PKCS#8 (PEM/DER), thường mã hóa thêm bằng passphrase (AES-256-CBC/PBKDF2).
- Public Key: X.509 SubjectPublicKeyInfo (PEM/DER) hoặc trong chứng chỉ X.509 (certificate).
- Bảo vệ Private Key: Lưu trữ trong HSM, TPM, Secure Enclave, YubiKey, hoặc file được mã hóa passphrase mạnh, quyền file 0400.
Các công cụ phổ biến
| Môi trường | Công cụ / Lệnh |
|---|---|
| Linux/macOS (OpenSSL) | openssl genpkey -algorithm Ed25519 -out private.keyopenssl pkey -in private.key -pubout -out public.pem |
| Linux/macOS (ssh-keygen) | ssh-keygen -t ed25519 -a 100 -f ~/.ssh/id_ed25519 (tạo cặp SSH key Ed25519) |
| Windows (PowerShell/OpenSSH) | ssh-keygen -t ed25519 (tương tự Linux) |
| Windows (PuTTYgen GUI) | Chọn EdDSA / RSA → Generate → Save private key (.ppk) & public key (OpenSSH format) |
| Python (cryptography library) | private_key = ed25519.Ed25519PrivateKey.generate() |
| Go / Rust / Node.js | Thư viện chuẩn crypto/ed25519, ring, @noble/ed25519 |
Ứng dụng thực tế
- SSH Authentication: Public key lên server (
~/.ssh/authorized_keys), Private key trên client. - TLS/HTTPS: Public key trong chứng chỉ X.509 (cấp bởi CA), Private key trên web server.
- Email Encryption/Signing: PGP/GPG (OpenPGP), S/MIME (X.509).
- Code Signing: Ký driver, ứng dụng, container image (cosign, sigstore).
- Blockchain / Crypto: Private key ký giao dịch, Public keyderive address.
Lưu ý an ninh quan trọng
- KHÔNG BAO GIỜ chia sẻ Private Key (file .pem, .ppk, .key, mnemonic seed phrase).
- Dùng Passphrase mạnh cho Private Key file.
- Xoay vòng khóa (Key Rotation) định kỳ: 1 năm cho RSA, 90 ngày cho signing key nhạy cảm.
- Thu hồi (Revocation) ngay khi nghi ngờ Private Key bị lộ (CRL, OCSP, CT log).
- Không tự "roll your own crypto" – dùng thư viện đã được kiểm toán (OpenSSL, BoringSSL, libsodium, cryptography.io).