SecLab
Cryptography & SecretsconceptĐộ khó 2/521 phút

Chọn đúng nguyên hàm, và không phát minh gì

Mục tiêu: Sau bài này bạn chọn được nguyên hàm mật mã từ một yêu cầu nghiệp vụ, và nhận ra ba dấu hiệu của mật mã tự phát minh.

V11A04:2025jwt
Bước 1 / 4 · read7 phút

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àmTrong .NET

Lưu mật khẩu | Password hash | Argon2id (xem bài password-storage) | Giữ kín dữ liệu 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:

  1. XOR với một khoá lặp. Đây không phải mã hoá; nó là encoding có thêm bước.
  2. 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.
  3. Một hàm tên Encrypt tự 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.
Xem lộ trình

Bình luận

Tham gia thảo luận
Đăng ký để 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.

Đăng kýĐăng nhập

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…