Bắt đầu từ yêu cầu, không từ thuật toán
Sai lầm phổ biến nhất về mật mã trong ứng dụng không phải chọn thuật toán yếu — mà là chọn thuật toán trước khi biết mình cần tính chất gì. "Chúng ta cần mã hoá cái này" là một câu chưa nói gì: mã hoá cho ai không đọc được? Có cần phát hiện sửa đổi? Có cần cùng input cho cùng output?
Bảng dưới đây đi từ yêu cầu tới nguyên hàm, và đó là chiều đúng:
| Tôi cần… | Nguyên hàm | Trong .NET |
|---|
Lưu mật khẩu | Password hash | Argon2id (xem bài password-storage) | Giữ kín dữ liệu và phát hiện sửa đổi | AEAD | AesGcm, ChaCha20Poly1305 | Chứng minh dữ liệu không bị sửa, cùng một bên kiểm | MAC | HMACSHA256 | Chứng minh nguồn gốc cho bên khác kiểm | Chữ ký số | ECDsa (P-256), RSA-PSS | Sinh token, ID, salt | CSPRNG | RandomNumberGenerator | Dẫn khoá từ một khoá khác | KDF | HKDF | So sánh hai secret | So sánh hằng thời gian | CryptographicOperations.FixedTimeEquals |
Hai dòng đáng nói riêng vì chúng là chỗ hay chọn sai:
AEAD, không phải "mã hoá". AES-CBC một mình chỉ giữ kín, không phát hiện sửa đổi — và một kẻ tấn công sửa được ciphertext thì thường lật được cả logic của bạn. AES-GCM làm cả hai việc trong một lời gọi. Nếu bạn thấy AesCbc trong code mà không có HMAC kèm thì đó là một phát hiện.
MAC và chữ ký số không thay nhau được. HMAC cần cả hai bên có cùng một khoá, nên bên kiểm cũng tạo được — nó chứng minh tính toàn vẹn, không chứng minh nguồn gốc. Chữ ký số dùng khoá riêng để ký và khoá công khai để kiểm, nên bên kiểm không ký được. Chọn HMAC khi cần "không ai sửa được" và chọn chữ ký khi cần "chứng minh được là tôi".
Ba dấu hiệu của mật mã tự phát minh, và mỗi cái đáng dừng lại khi thấy trong review:
- XOR với một khoá lặp. Đây không phải mã hoá; nó là encoding có thêm bước.
- Hash rồi coi kết quả là bí mật. Hash không có khoá, nên ai cũng tính lại được.
- Một hàm tên
Encrypttự viết nhiều hơn năm dòng. Nguyên hàm đúng luôn là một lời gọi vào thư viện chuẩn; mọi dòng thêm là một chỗ để sai.
Bình luận
Bình luận cần tài khoản đã hoàn thành ít nhất một bài học. Điều kiện đó là thứ giữ cho luồng thảo luận này còn đáng đọc: mỗi ý kiến gắn với một người có thể bị hỏi lại, và reputation tích luỹ theo thời gian.
Bạn vẫn đọc được toàn bộ bình luận dưới đây mà không cần tài khoản. Đăng nhập xong bạn sẽ quay lại đúng chỗ này, không phải đầu trang.
Đang tải bình luận…