Mã hóa (encryption) là quá trình chuyển đổi dữ liệu thành dạng không thể đọc được nếu không có khóa đặc biệt. Trong các ứng dụng di động, mã hóa bảo vệ dữ liệu cá nhân của người dùng, thông tin thanh toán và logic kinh doanh khỏi bị đánh cắp và rò rỉ. Theo Statista (2024), số vụ rò rỉ dữ liệu từ ứng dụng di động đã tăng 38% trong hai năm và trong 72% trường hợp, nguyên nhân là thiếu hoặc sử dụng mã hóa không đúng cách. Các nền tảng di động hiện đại cung cấp API tích hợp sẵn cho mã hóa và việc sử dụng chúng là tiêu chuẩn bảo mật bắt buộc. Statista, 2024
Những điểm chính
Mã hóa trong bối cảnh ứng dụng di động là việc áp dụng các thuật toán mật mã để bảo vệ dữ liệu được lưu trữ trên thiết bị (data at rest) và dữ liệu được truyền qua mạng (data in transit). Ở cấp độ thiết bị, bộ nhớ cục bộ được mã hóa: tệp tin, cơ sở dữ liệu, SharedPreferences và bộ nhớ đệm. Ở cấp độ mạng, lưu lượng truy cập giữa ứng dụng và máy chủ được mã hóa qua các giao thức TLS/HTTPS. Mục tiêu cuối cùng là đảm bảo rằng ngay cả khi có quyền truy cập vật lý vào thiết bị hoặc đánh chặn lưu lượng, kẻ tấn công cũng không thể đọc được dữ liệu được bảo vệ mà không có khóa mật mã.
Các thiết bị di động đặc biệt dễ bị mất dữ liệu: điện thoại có thể dễ dàng bị mất, bị đánh cắp hoặc bị nhiễm phần mềm độc hại. Theo Ponemon Institute (2023), 42% công ty bị ảnh hưởng bởi rò rỉ dữ liệu cho rằng nguyên nhân đến từ thiết bị di động. Nếu không có mã hóa, kẻ tấn công có thể kết nối với thiết bị qua USB, trích xuất cơ sở dữ liệu SQLite và đọc tất cả dữ liệu đã lưu trữ. Mã hóa giải quyết vấn đề này: ngay cả khi cơ sở dữ liệu bị trích xuất, nội dung của nó vẫn được mã hóa. Ngoài ra, ở Mỹ và EU có các luật (GDPR, CCPA) yêu cầu mã hóa dữ liệu cá nhân và áp dụng mức phạt lên tới 4% doanh thu hàng năm nếu vi phạm. Sử dụng mã hóa không chỉ là nhu cầu kỹ thuật mà còn là nhu cầu pháp lý đối với bất kỳ ứng dụng di động nào xử lý dữ liệu người dùng.
Tất cả các thuật toán mã hóa được chia thành hai loại chính: đối xứng (một khóa cho mã hóa và giải mã) và bất đối xứng (một cặp khóa — công khai và riêng tư). Việc chọn loại phụ thuộc vào kịch bản sử dụng: để mã hóa dữ liệu cục bộ, thường sử dụng thuật toán đối xứng vì tốc độ của chúng, còn để trao đổi khóa và xác thực, sử dụng thuật toán bất đối xứng.
| Đặc điểm | Đối xứng | Bất đối xứng |
|---|---|---|
| Số lượng khóa | 1 (bí mật) | 2 (công khai + riêng tư) |
| Tốc độ | Cao (1–10 GB/s) | Thấp (1–10 MB/s) |
| Phân phối khóa | Có vấn đề — cần truyền khóa | Đơn giản — khóa công khai được công bố |
| Ví dụ | AES, ChaCha20 | RSA, ECDH, ECIES |
| Sử dụng trong phát triển di động | Mã hóa dữ liệu cục bộ | Trao đổi khóa, chữ ký số |
Trong thực tế, các ứng dụng di động sử dụng mã hóa lai: bằng thuật toán bất đối xứng (ví dụ ECDH), các bên trao đổi khóa phiên, và tất cả dữ liệu tiếp theo được mã hóa bằng thuật toán đối xứng (AES hoặc ChaCha20). Cách tiếp cận này kết hợp tốc độ của mã hóa đối xứng với tính bảo mật của trao đổi khóa bất đối xứng. Phương pháp này là nền tảng của TLS 1.3, Signal Protocol và Apple iMessage.
Phát triển di động hiện đại sử dụng một số thuật toán mã hóa được tiêu chuẩn hóa, mỗi thuật toán được thiết kế cho các nhiệm vụ cụ thể với lĩnh vực ứng dụng riêng.
Mã hóa bảo vệ dữ liệu trong ba kịch bản chính: mất thiết bị (mã hóa đĩa và vùng chứa ứng dụng), đánh chặn lưu lượng (giao thức mạng TLS/HTTPS) và rò rỉ từ máy chủ (mã hóa đầu cuối). Mỗi kịch bản yêu cầu cách tiếp cận và công cụ riêng.
Dữ liệu tĩnh — dữ liệu trên thiết bị — được mã hóa qua Android Keystore và iOS Keychain. Trên Android từ phiên bản 7.0, mã hóa dựa trên tệp (File-Based Encryption) được sử dụng và các ứng dụng có thể mã hóa thêm dữ liệu của mình qua EncryptedSharedPreferences và EncryptedFile từ thư viện AndroidX Security. Trên iOS, tất cả ứng dụng mặc định hoạt động với Data Protection API, mã hóa tệp ở cấp hệ thống tệp bằng khóa gắn với mã thiết bị. Đối với dữ liệu đang truyền, TLS 1.2/1.3 được sử dụng với Certificate Pinning bắt buộc.
Mã hóa đầu cuối (E2E) là cấp độ bảo vệ dữ liệu cao nhất, trong đó tin nhắn được mã hóa trên thiết bị của người gửi và chỉ được giải mã trên thiết bị của người nhận. Máy chủ lưu trữ và truyền tải không có quyền truy cập vào nội dung — máy chủ chỉ xử lý các blob đã mã hóa. Triển khai E2E nổi tiếng nhất cho ứng dụng di động là Signal Protocol, sử dụng Double Ratchet Algorithm kết hợp với X3DH (Extended Triple Diffie-Hellman) để trao đổi khóa ban đầu. Signal Protocol cung cấp Perfect Forward Secrecy và future secrecy: việc xâm phạm một khóa không tiết lộ các tin nhắn trước đó hoặc sau đó. Theo một nghiên cứu của Đại học Carnegie Mellon (2023), mã hóa E2E trong ứng dụng nhắn tin giúp giảm nguy cơ rò rỉ giao tiếp tới 99,7% so với chỉ mã hóa TLS. Việc sử dụng E2E là bắt buộc đối với các ứng dụng thuộc danh mục Health & Fitness và Finance theo yêu cầu của GDPR và HIPAA. Để triển khai E2E trong dự án của riêng bạn, nên sử dụng thư viện Signal Protocol (Java/Swift) hoặc dựa trên Olm (Matrix protocol). Khi chọn giải pháp E2E, hãy đánh giá khả năng tương thích nền tảng: Signal Protocol yêu cầu hỗ trợ gửi không đồng bộ và lưu trữ khóa trên máy khách, điều này làm phức tạp các kịch bản đa thiết bị — trong những trường hợp như vậy, Matrix Protocol với mô hình phòng của nó có thể là lựa chọn tốt hơn.
Hãy xem ví dụ về mã hóa và giải mã dữ liệu trên Android sử dụng Jetpack Security (AndroidX Security). Thư viện cung cấp EncryptedFile để mã hóa tệp và EncryptedSharedPreferences cho cài đặt.
val masterKey = MasterKey.Builder(context)
.setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
.build()
val encryptedFile = EncryptedFile.Builder(
context,
File(context.filesDir, "secret.dat"),
masterKey,
EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB
).build()
encryptedFile.openFileOutput(applicationContext).use { outputStream ->
outputStream.write("Sensitive user data".toByteArray(Charsets.UTF_8))
}
MasterKey được tạo bằng AES256-GCM — chế độ mã hóa đối xứng an toàn nhất. Khóa được lưu trữ trong Android Keystore, cách ly với tiến trình chính: ngay cả khi ứng dụng bị xâm phạm, kẻ tấn công cũng không thể trích xuất khóa. EncryptedFile sử dụng lược đồ AES-256-GCM với HKDF để dẫn xuất khóa và kích thước trang 4KB, mang lại sự cân bằng tốt giữa tốc độ và bảo mật. Để đọc dữ liệu, openFileInput được sử dụng với các tham số tương tự: thư viện tự động giải mã dữ liệu khi đọc.
Trên iOS, chức năng tương tự được cung cấp qua CryptoKit (Swift) sử dụng AES.GCM hoặc ChaChaPoly. Khóa được lưu trữ trong Secure Enclave qua Keychain Services. Nguyên tắc tương tự: khóa không bao giờ rời khỏi bộ nhớ phần cứng an toàn và dữ liệu được mã hóa trước khi ghi vào đĩa. Kiến trúc này tuân thủ các khuyến nghị của OWASP MASVS (Mobile Application Security Verification Standard) cấp L2 cho các ứng dụng xử lý dữ liệu nhạy cảm. Trong các dự án thực tế, sự kết hợp giữa EncryptedSharedPreferences cho token và EncryptedFile cho dữ liệu người dùng bao phủ 100% các kịch bản mã hóa cục bộ. Ngoài ra, để làm việc với các khóa nhận được từ máy chủ (ví dụ: khóa phiên ECDH), Android KeyStore được sử dụng với tham số purpose = KeyProperties.PURPOSE_ENCRYPT, đảm bảo rằng khóa chỉ có thể được sử dụng cho các hoạt động mật mã được ủy quyền và không bao giờ được xuất từ bộ nhớ phần cứng sang RAM dưới dạng văn bản thuần túy.
Câu hỏi thường gặp
AES-256 ở chế độ GCM với lưu trữ khóa trong bộ nhớ phần cứng (Android Keystore / iOS Keychain) được coi là tiêu chuẩn vàng. Đối với lưu lượng mạng — TLS 1.3 với đường cong elliptic Curve25519. ChaCha20-Poly1305 được sử dụng như một giải pháp thay thế trên các thiết bị không có AES phần cứng.
AES là thuật toán đối xứng (một khóa), nhanh, phù hợp để mã hóa khối lượng lớn dữ liệu. RSA là bất đối xứng (cặp khóa), chậm, được sử dụng để mã hóa khóa và chữ ký, không phải dữ liệu. Trong ứng dụng di động, AES mã hóa dữ liệu, RSA bảo vệ khóa.
Cần mã hóa dữ liệu nhạy cảm: token truy cập, mật khẩu, thông tin cá nhân, dữ liệu thanh toán, hồ sơ y tế. Dữ liệu công khai (hình ảnh, nội dung) có thể không mã hóa, nhưng tốt hơn nên lưu trữ chúng trong vùng chứa được bảo vệ của ứng dụng.
Với mã hóa đầu cuối, dữ liệu được mã hóa trên thiết bị của người gửi trước khi gửi và chỉ được giải mã trên thiết bị của người nhận. Máy chủ chỉ thấy dữ liệu đã mã hóa. Giao thức Double Ratchet, được triển khai trong Signal Protocol, là cơ chế E2E phổ biến nhất trong các ứng dụng nhắn tin di động.
Về mặt kỹ thuật có thể, nhưng không được khuyến nghị. Đối với dữ liệu trên thiết bị, hãy sử dụng mã hóa đối xứng (AES-GCM) với khóa từ Keystore. Đối với mạng, hãy sử dụng TLS 1.3 với bộ khóa riêng biệt và Certificate Pinning. Việc tách biệt ngăn chặn cả hai kênh bị xâm phạm nếu một khóa bị rò rỉ.
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm