Bảo vệ log khi truyền qua mạng: RSA kết hợp AES-256-GCM
Log thường chứa nhiều thông tin hơn ta nghĩ: địa chỉ API nội bộ, mã đơn hàng, cấu trúc dữ liệu, đôi khi cả thông tin người dùng. Khi gửi log qua Internet, bảo vệ đường truyền là bắt buộc. Bài viết giải thích mô hình mã hóa lai RSA và AES-GCM theo cách dễ hiểu, lấy HVTD-9803 LogCat làm ví dụ.
Log nhạy cảm hơn bạn nghĩ
Một dòng log tưởng vô hại như GET /internal/v2/orders/88213 → 200 đã tiết lộ cấu trúc API nội bộ và một mã đơn hàng thật. Gộp hàng nghìn dòng như vậy lại, người ngoài có thể hình dung khá rõ hệ thống của bạn. Vì thế, mọi kênh truyền log ra khỏi thiết bị cần đảm bảo hai điều:
- Bí mật: người nghe lén trên đường truyền không đọc được nội dung.
- Toàn vẹn: không ai sửa hoặc chèn log giả vào luồng mà không bị phát hiện.
Hai loại mã hóa
Mã hóa bất đối xứng (RSA)
RSA dùng một cặp khóa: khóa công khai để mã hóa và khóa bí mật để giải mã. Ai cũng có thể dùng khóa công khai để “khóa” dữ liệu, nhưng chỉ người giữ khóa bí mật mới “mở” được. Nhờ vậy, khóa công khai có thể gửi qua kênh không an toàn như tin nhắn chat mà không sợ lộ.
Nhược điểm của RSA là chậm và chỉ mã hóa được lượng dữ liệu nhỏ trong mỗi lần. Với khóa 2048 bit, mỗi lần mã hóa chỉ chứa được hơn hai trăm byte.
Mã hóa đối xứng (AES)
AES dùng cùng một khóa cho cả mã hóa và giải mã. AES rất nhanh, được tăng tốc phần cứng trên hầu hết điện thoại hiện đại, nên phù hợp để mã hóa luồng dữ liệu liên tục như log. Vấn đề duy nhất: làm sao để hai bên có chung một khóa mà không ai khác biết?
Mã hóa lai: lấy ưu điểm của cả hai
Giải pháp phổ biến, cũng là nguyên lý của HTTPS, là mã hóa lai: dùng RSA để trao đổi an toàn một khóa AES ngẫu nhiên, sau đó dùng AES để mã hóa dữ liệu thật. Trong HVTD-9803 LogCat, quy trình diễn ra như sau:
- Ứng dụng Listener tạo cặp khóa RSA-2048 ngay trên thiết bị. Khóa bí mật không bao giờ rời thiết bị.
- Khóa công khai được gửi tới trang Receiver. Máy chủ sinh ngẫu nhiên một khóa AES-256 cho phiên.
- Máy chủ mã hóa khóa phiên cùng địa chỉ kết nối bằng khóa công khai RSA, tạo ra “mã authen”.
- Listener dùng khóa bí mật giải mã mã authen để có khóa phiên và chuyển khóa này cho thư viện trong ứng dụng của bạn. Kẻ nghe lén chỉ thấy chuỗi đã mã hóa.
- Từ đó, thư viện mã hóa mỗi dòng log bằng AES-256-GCM; Listener chuyển nguyên gói đã mã hóa lên máy chủ.
Vì sao lại là AES-GCM?
AES có nhiều chế độ hoạt động. GCM (Galois/Counter Mode) là chế độ mã hóa xác thực (AEAD): ngoài việc làm dữ liệu không đọc được, nó còn tạo ra một thẻ xác thực 16 byte đi kèm mỗi gói tin. Khi giải mã, nếu dữ liệu hoặc thẻ bị sửa dù chỉ một bit, việc giải mã thất bại ngay.
Điều này đáp ứng cả hai yêu cầu bí mật và toàn vẹn. Trong HVTD-9803 LogCat, nếu một gói log bị hỏng hoặc được mã hóa bằng khóa sai, máy chủ sẽ không hiển thị nội dung giả mà báo dòng “Decrypt error” để bạn biết có vấn đề.
Một quy tắc quan trọng của AES-GCM: với cùng một khóa, mỗi gói tin nên dùng một giá trị nonce (IV) khác nhau. Khi tự triển khai GCM trong dự án của bạn, hãy sinh nonce ngẫu nhiên cho từng lần mã hóa hoặc dùng bộ đếm tăng dần.
Mã hóa bảo vệ được gì, không bảo vệ được gì?
Hiểu đúng giới hạn của mã hóa cũng quan trọng như việc dùng nó. Với mô hình của HVTD-9803 LogCat:
| Bảo vệ được | Không bảo vệ được |
|---|---|
| Kẻ nghe lén trên mạng Wi-Fi, nhà mạng hay proxy không đọc được log. | Người có URL phiên vẫn xem được log, vì đó là mục đích của công cụ. |
| Log bị sửa hoặc chèn trên đường truyền sẽ bị phát hiện. | Máy chủ Receiver giải mã log để chuyển tiếp tới trình duyệt qua HTTPS, nên máy chủ phải được tin cậy. |
| Khóa phiên khác nhau cho mỗi phiên; reset phiên là khóa cũ bị hủy. | Dữ liệu nhạy cảm bạn tự ghi vào log vẫn hiện rõ với người xem. |
Để giảm rủi ro ở cột bên phải, HVTD-9803 LogCat không lưu log xuống ổ đĩa, tự hủy phiên không hoạt động và khuyến nghị bạn reset phiên ngay khi xong việc.
Thực hành tốt khi ghi log
- Không bao giờ log bí mật: mật khẩu, token, mã OTP, khóa API.
- Che dữ liệu cá nhân: chỉ log vài ký tự cuối số điện thoại hay email, ví dụ
***6789. - Log định danh thay vì nội dung: log
orderIdthay vì toàn bộ thông tin đơn hàng. - Tách log debug khỏi bản phát hành: xem cách làm trong bài Các mức độ log trong Android.
Tóm tắt
Mã hóa lai RSA và AES-GCM cho phép trao đổi khóa an toàn qua kênh không tin cậy và mã hóa nhanh luồng log liên tục, đồng thời phát hiện mọi sửa đổi trên đường truyền. Nhưng mã hóa chỉ là một lớp bảo vệ: thói quen ghi log cẩn thận và quản lý phiên chặt chẽ mới giúp log của bạn thực sự an toàn.