Bảo mật ứng dụng di động cơ bản: những lỗi người mới hay mắc

  • author-image

    Nguyễn Đình Cường

  • blog-tag
  • blog-comment 0 comment
  • created-date 09 Nov, 2026
blog-thumbnail

Nhiều người nghĩ bảo mật là việc của máy chủ, còn ứng dụng chỉ là giao diện. Thực tế ứng dụng nằm trong tay người dùng, tức là cũng nằm trong tay kẻ xấu: nó có thể bị dịch ngược, phân tích lưu lượng và sửa đổi. Bài viết nêu các nguyên tắc cơ bản giúp tránh lỗi phổ biến.

Giả định cơ bản: ứng dụng không đáng tin

Mã trong ứng dụng có thể bị tháo ra và đọc. Mọi dữ liệu lưu trên máy có thể bị truy cập nếu máy bị root hoặc jailbreak. Mọi lưu lượng có thể bị chặn xem nếu không bảo vệ. Vì thế, máy chủ không bao giờ được tin tưởng dữ liệu từ ứng dụng mà không kiểm tra lại.

1. Không nhúng bí mật vào ứng dụng

Khóa API riêng tư, mật khẩu cơ sở dữ liệu, khóa ký đều không được nằm trong mã ứng dụng, dù có làm rối. Nếu ứng dụng cần gọi dịch vụ bên thứ ba bằng khóa bí mật, hãy để máy chủ của bạn gọi thay và ứng dụng chỉ nói chuyện với máy chủ đó. Khóa công khai dành cho ứng dụng khách thì cần giới hạn phạm vi sử dụng ở phía nhà cung cấp, ví dụ theo mã định danh ứng dụng.

2. Lưu trữ dữ liệu nhạy cảm đúng nơi

  • Token và thông tin đăng nhập nên lưu trong Keychain (iOS) hoặc Keystore (Android), qua thư viện lưu trữ an toàn.
  • Không lưu dữ liệu nhạy cảm trong tệp văn bản, SharedPreferences hay UserDefaults không mã hóa.
  • Không ghi dữ liệu nhạy cảm vào nhật ký, bộ nhớ đệm hay ảnh chụp màn hình tự động của hệ thống.
  • Chỉ lưu những gì thật sự cần và xóa khi đăng xuất.

3. Bảo vệ đường truyền

  1. Luôn dùng HTTPS; không tắt kiểm tra chứng chỉ để "cho chạy được".
  2. Cấu hình ứng dụng không cho phép truyền văn bản thuần trên Internet.
  3. Cân nhắc certificate pinning cho ứng dụng nhạy cảm như ngân hàng, kèm kế hoạch xoay chứng chỉ để không khóa chết người dùng.
  4. Không đưa dữ liệu nhạy cảm vào đường dẫn URL.

4. Xác thực và phân quyền ở máy chủ

Việc kiểm tra quyền như người dùng này có được xem đơn hàng kia không phải làm ở máy chủ. Nếu chỉ ẩn nút trong ứng dụng, kẻ tấn công vẫn có thể gọi trực tiếp API. Mỗi yêu cầu cần được xác thực và phân quyền độc lập, kiểm tra dữ liệu đầu vào ở máy chủ.

5. Làm khó việc dịch ngược

Làm rối mã (obfuscation) không ngăn được kẻ quyết tâm nhưng làm tăng chi phí tấn công. Với Android, bật R8; với Flutter, dùng tùy chọn obfuscate khi build bản phát hành:

flutter build apk --release --obfuscate --split-debug-info=build/symbols

Hãy lưu thư mục symbols để giải mã nhật ký sập về sau. Nên hiểu đây chỉ là một lớp phòng thủ, không thay thế việc đặt logic bảo mật ở máy chủ.

6. Cẩn thận với thư viện bên thứ ba

  • Chỉ dùng thư viện cần thiết, từ nguồn đáng tin và được bảo trì.
  • Cập nhật khi có bản vá bảo mật; theo dõi cảnh báo lỗ hổng của hệ sinh thái bạn dùng.
  • Rà soát những gì SDK quảng cáo và phân tích thu thập để khai báo đúng với cửa hàng.

7. Xử lý đầu vào và liên kết ngoài

Coi dữ liệu từ deep link, WebView, tệp được chia sẻ hay thông báo là không đáng tin; kiểm tra và làm sạch trước khi dùng. Với WebView, tắt JavaScript nếu không cần và không bật quyền truy cập tệp dư thừa. Không cho WebView tải nội dung tùy ý với quyền cao.

8. Sinh trắc học và khóa ứng dụng

Dùng API sinh trắc học của hệ điều hành để bảo vệ thao tác nhạy cảm; đừng tự cài đặt. Kết hợp với kho khóa an toàn để dữ liệu chỉ mở khi xác thực thành công.

Danh sách kiểm tra nhanh trước khi phát hành

  1. Không còn khóa bí mật trong mã nguồn hay tệp cấu hình đóng gói.
  2. Tắt log gỡ lỗi và chế độ debug trong bản phát hành.
  3. Tất cả yêu cầu mạng dùng HTTPS.
  4. Token lưu trong kho an toàn và xóa khi đăng xuất.
  5. Máy chủ kiểm tra quyền cho mọi thao tác.
  6. Đã rà soát quyền xin và thư viện bên thứ ba.

Kết luận

Bảo mật là nhiều lớp phòng thủ chứ không phải một công tắc. Nguyên tắc nền tảng là không tin ứng dụng khách, không nhúng bí mật và bảo vệ dữ liệu khi lưu lẫn khi truyền. Làm đúng những điều cơ bản này đã chặn được phần lớn lỗi thường gặp.

Nếu bạn muốn hiểu bảo mật từ cả hai phía ứng dụng và máy chủ, hãy xem thêm các khóa học tại codebem.com.

author_photo
Nguyễn Đình Cường

0 comment