1. Mã hoá nằm ở đâu trong Cybersecurity?
Cybersecurity là một lĩnh vực rộng bao gồm nhiều tầng bảo vệ. Mã hoá không phải toàn bộ — nhưng là xương sống kỹ thuật mà gần như mọi cơ chế bảo mật khác đều dựa vào.
2. Ba trụ cột của mã hoá
Mọi hệ thống mã hoá đều xoay quanh ba mục tiêu bảo mật gọi là CIA Triad — không phải tình báo, mà là:
3. Mã hoá đối xứng — AES-256-GCM
Dùng cùng một khoá để mã hoá và giải mã. Nhanh, phù hợp cho khối lượng dữ liệu lớn. Chuẩn vàng hiện nay là AES-256-GCM — kết hợp mã hoá và xác thực toàn vẹn dữ liệu.

Code JavaScript | Node.JS mã hoá AES-256-GCM
⚠️ CẠM BẪY PHỔ BIẾN
Không bao giờ tái sử dụng IV với cùng một khoá. Đây là lỗ hổng nghiêm trọng cho phép kẻ tấn công giải mã toàn bộ dữ liệu — luôn dùng crypto.randomBytes(12) cho mỗi lần mã hoá.
4. Mã hoá bất đối xứng — Nền tảng của HTTPS
Dùng cặp khoá: public key để mã hoá (chia sẻ công khai), private key để giải mã (chỉ mình bạn giữ). Đây là cơ chế nền tảng của TLS, PKI và chữ ký số.

Code Python mã hoá RSA
Trong thực tế, HTTPS dùng hybrid encryption: RSA/ECDH để trao đổi khoá phiên, sau đó AES để mã hoá toàn bộ lưu lượng. Asymmetric crypto chậm — chỉ dùng để "bắt tay", sau đó nhường cho symmetric.
5. Hashing mật khẩu — Không phải mã hoá
Hash là hàm một chiều, không thể đảo ngược. Không có khoá để giải mã. Đây là cách đúng để lưu mật khẩu người dùng — kể cả bạn cũng không nên biết mật khẩu của họ.

Code Python sử dụng thuật toán bcrypt
6. Những sai lầm thường gặp trong thực tế

Cybersecurity là một lĩnh vực rộng bao gồm nhiều tầng bảo vệ. Mã hoá không phải toàn bộ — nhưng là xương sống kỹ thuật mà gần như mọi cơ chế bảo mật khác đều dựa vào.
2. Ba trụ cột của mã hoá
Mọi hệ thống mã hoá đều xoay quanh ba mục tiêu bảo mật gọi là CIA Triad — không phải tình báo, mà là:
3. Mã hoá đối xứng — AES-256-GCM
Dùng cùng một khoá để mã hoá và giải mã. Nhanh, phù hợp cho khối lượng dữ liệu lớn. Chuẩn vàng hiện nay là AES-256-GCM — kết hợp mã hoá và xác thực toàn vẹn dữ liệu.
Code JavaScript | Node.JS mã hoá AES-256-GCM
| const crypto = require('crypto'); function encrypt(plaintext, key) { // IV luôn random và duy nhất — không bao giờ tái sử dụng const iv = crypto.randomBytes(12); const cipher = crypto.createCipheriv('aes-256-gcm', key, iv); let enc = Buffer.concat([ cipher.update(plaintext, 'utf8'), cipher.final() ]); // GCM auth tag — phát hiện dữ liệu bị giả mạo const tag = cipher.getAuthTag(); // Gói iv + tag + data → lưu hoặc truyền đi return Buffer.concat([iv, tag, enc]).toString('base64'); } function decrypt(ciphertext, key) { const buf = Buffer.from(ciphertext, 'base64'); const iv = buf.slice(0, 12); const tag = buf.slice(12, 28); const data = buf.slice(28); const dec = crypto.createDecipheriv('aes-256-gcm', key, iv); dec.setAuthTag(tag); return Buffer.concat([dec.update(data), dec.final()]).toString('utf8'); } // Sử dụng const key = crypto.randomBytes(32); // 256-bit const encrypted = encrypt('dữ liệu nhạy cảm', key); const decrypted = decrypt(encrypted, key); |
Không bao giờ tái sử dụng IV với cùng một khoá. Đây là lỗ hổng nghiêm trọng cho phép kẻ tấn công giải mã toàn bộ dữ liệu — luôn dùng crypto.randomBytes(12) cho mỗi lần mã hoá.
4. Mã hoá bất đối xứng — Nền tảng của HTTPS
Dùng cặp khoá: public key để mã hoá (chia sẻ công khai), private key để giải mã (chỉ mình bạn giữ). Đây là cơ chế nền tảng của TLS, PKI và chữ ký số.
Code Python mã hoá RSA
| from cryptography.hazmat.primitives.asymmetric import rsa, padding from cryptography.hazmat.primitives import hashes # Tạo cặp khoá 2048-bit private_key = rsa.generate_private_key( public_exponent=65537, key_size=2048 ) public_key = private_key.public_key() # Mã hoá bằng public key (gửi đi an toàn) oaep = padding.OAEP( mgf=padding.MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256() ) ciphertext = public_key.encrypt(b"du lieu bi mat", oaep) # Giải mã chỉ bằng private key plaintext = private_key.decrypt(ciphertext, oaep) |
Trong thực tế, HTTPS dùng hybrid encryption: RSA/ECDH để trao đổi khoá phiên, sau đó AES để mã hoá toàn bộ lưu lượng. Asymmetric crypto chậm — chỉ dùng để "bắt tay", sau đó nhường cho symmetric.
5. Hashing mật khẩu — Không phải mã hoá
Hash là hàm một chiều, không thể đảo ngược. Không có khoá để giải mã. Đây là cách đúng để lưu mật khẩu người dùng — kể cả bạn cũng không nên biết mật khẩu của họ.
Code Python sử dụng thuật toán bcrypt
| import bcrypt def hash_password(password: str) -> str: # rounds=12 → ~250ms/hash. Tăng rounds khi phần cứng mạnh hơn salt = bcrypt.gensalt(rounds=12) return bcrypt.hashpw(password.encode(), salt).decode() def verify(password: str, hashed: str) -> bool: return bcrypt.checkpw(password.encode(), hashed.encode()) # Khi đăng ký hashed = hash_password("matkhauNguoiDung@2024") # Lưu `hashed` vào DB — không bao giờ lưu plaintext # Khi đăng nhập ok = verify("matkhauNguoiDung@2024", hashed) # True |