Secure Storage trong ứng dụng di động: định nghĩa, phương pháp và triển khai

Tác giả: IT Sectr Đã đăng: 2026-04-04 Thời gian đọc: 9 phút

Secure Storage là tập hợp các phương pháp và công nghệ để bảo vệ dữ liệu bảo mật trên thiết bị: token, khóa mã hóa, thông tin thanh toán và dữ liệu cá nhân của người dùng. Theo OWASP Mobile Top 10 (2024), lưu trữ dữ liệu không an toàn nằm trong ba rủi ro nghiêm trọng nhất. Việc triển khai đúng cách Secure Storage ngăn chặn rò rỉ dữ liệu ngay cả khi có truy cập vật lý vào thiết bị.

Điểm chính

  • Secure Storage — một tập hợp các phương pháp mã hóa và cô lập dữ liệu trên thiết bị để ngăn chặn truy cập từ các ứng dụng khác và kẻ tấn công.
  • Android Keystore — một kho lưu trữ mật mã tạo và bảo vệ khóa ở cấp độ phần cứng (TEE).
  • iOS Keychain — cơ sở dữ liệu an toàn để lưu trữ bí mật, được mã hóa ở cấp hệ điều hành với quyền truy cập qua Security framework.
  • EncryptedSharedPreferences — thư viện Android Jetpack để mã hóa cặp khóa-giá trị bằng AES-256.
  • Data Protection API — cơ chế iOS mã hóa tệp dựa trên lớp bảo vệ gắn với trạng thái khóa thiết bị.

Secure Storage là gì?

Secure Storage là việc lưu trữ dữ liệu bảo mật của ứng dụng di động sao cho không thể truy cập được từ các ứng dụng khác, phần mềm độc hại và kẻ tấn công có quyền truy cập vật lý vào thiết bị. Khác với lưu trữ thông thường, Secure Storage sử dụng mã hóa, cô lập và bảo vệ phần cứng.

Không phải tất cả dữ liệu đều cần Secure Storage: ảnh hồ sơ hoặc bộ nhớ đệm tin tức có thể được lưu trữ trong hệ thống tệp thông thường. Tuy nhiên, khóa mã hóa, token xác thực, dữ liệu thanh toán, khóa riêng tư và mẫu sinh trắc học phải được bảo vệ. Theo Google Security Blog (2025), 67% lỗ hổng trong ứng dụng di động liên quan đến việc lưu trữ bí mật dưới dạng văn bản thuần túy.

Mỗi nền tảng di động cung cấp cơ chế Secure Storage riêng: Android — Keystore và EncryptedSharedPreferences, iOS — Keychain và Data Protection API. Các cơ chế này được tích hợp với mô-đun bảo mật phần cứng (TEE, Secure Enclave) và đảm bảo dữ liệu không thể bị đọc ngay cả sau khi jailbreak hoặc root thiết bị.

Việc lựa chọn đúng phương pháp Secure Storage phụ thuộc vào loại dữ liệu, kịch bản sử dụng và yêu cầu hiệu suất. Hiểu được kiến trúc của từng cơ chế cho phép nhà phát triển đưa ra quyết định kiến trúc đúng đắn.

Secure Storage trên Android

Nền tảng Android cung cấp nhiều cấp độ bảo vệ dữ liệu, từ lưu trữ khóa phần cứng đến SharedPreferences đã mã hóa. Lựa chọn phụ thuộc vào độ nhạy cảm của dữ liệu và yêu cầu hiệu suất.

Android Keystore — Lưu trữ khóa phần cứng

Android Keystore là nhà cung cấp mật mã tạo và lưu trữ khóa trong môi trường thực thi cô lập (TEE — Trusted Execution Environment) trên các thiết bị hỗ trợ bảo vệ phần cứng. Khóa không bao giờ rời khỏi TEE: các thao tác mật mã được thực hiện trong một khu vực được bảo vệ mà ngay cả hệ điều hành cũng không thể truy cập.

Từ Android 9 (API 28), Keystore hỗ trợ StrongBox Keymaster — một chip bảo mật chuyên dụng với CPU riêng, Bộ tạo số ngẫu nhiên thực (TRNG) và bộ nhớ được bảo vệ. StrongBox được chứng nhận theo Common Criteria EAL 4+ và là cấp độ bảo mật lưu trữ khóa cao nhất trên Android. Để sử dụng StrongBox, bạn phải chỉ định rõ cờ inStrongBox() khi tạo khóa.

Keystore hỗ trợ các thuật toán: AES/GCM/NoPadding (256 bit), EC (secp256r1, secp384r1), RSA (2048–4096 bit) và HMAC-SHA256. Tất cả các khóa có thể được gắn với xác thực sinh trắc học thông qua setUserAuthenticationRequired(true).

EncryptedSharedPreferences

EncryptedSharedPreferences là thư viện từ gói AndroidX Security tự động mã hóa tất cả dữ liệu được lưu qua API SharedPreferences. Giá trị được mã hóa bằng khóa AES-256 GCM và khóa được mã hóa bằng AES-256 SIV (IV tổng hợp), ngăn chặn các cuộc tấn công từ điển vào tên khóa.

Khóa mã hóa chính được lưu trong Android Keystore, cung cấp bảo vệ hai cấp: Keystore bảo vệ khóa chính, EncryptedSharedPreferences bảo vệ dữ liệu. Hiệu suất mã hóa dưới 5 ms mỗi thao tác đọc/ghi cho dữ liệu điển hình (token, cài đặt), làm cho thư viện phù hợp với các kịch bản người dùng.

EncryptedSharedPreferences không được thiết kế cho khối lượng dữ liệu lớn (trên 5 MB) — hãy sử dụng cơ sở dữ liệu đã mã hóa qua SQLCipher hoặc Room với mã hóa.

SQLCipher — Cơ sở dữ liệu đã mã hóa

SQLCipher là phần mở rộng của SQLite mã hóa toàn bộ cơ sở dữ liệu từng trang một bằng AES-256-CBC. Mỗi trang của cơ sở dữ liệu được mã hóa bằng một khóa riêng biệt dẫn xuất từ mật khẩu chính qua PBKDF2. SQLCipher thêm khoảng 5–15% chi phí hiệu suất tùy theo kích thước dữ liệu.

Tích hợp với Android được thực hiện qua thư viện net.zetetic:android-database-sqlcipher, cung cấp API tương thích với SQLiteOpenHelper tiêu chuẩn. Mật khẩu cho SQLCipher nên được lưu trong Keystore, không phải trong mã hoặc SharedPreferences.

Secure Storage trên iOS

Nền tảng iOS cung cấp Keychain Services làm kho lưu trữ an toàn chính, cũng như API Data Protection để mã hóa tệp ở cấp hệ điều hành.

Keychain Services

Keychain là một cơ sở dữ liệu SQLite đã mã hóa, nơi iOS lưu trữ mật khẩu, khóa mã hóa, chứng chỉ và ghi chú. Mỗi mục Keychain (SecItem) được lưu ở dạng mã hóa bằng khóa phần cứng duy nhất của thiết bị. Quyền truy cập vào một mục được kiểm soát qua ACL (Danh sách kiểm soát truy cập), có thể yêu cầu xác thực sinh trắc học (Face ID, Touch ID) hoặc mã truy cập.

Keychain hỗ trợ các lớp bảo vệ xác định thời điểm dữ liệu có thể truy cập: kSecAttrAccessibleWhenUnlockedThisDeviceOnly — dữ liệu chỉ có thể truy cập khi thiết bị được mở khóa và không được chuyển trong quá trình sao lưu. Lớp này được khuyến nghị cho hầu hết các kịch bản lưu trữ token xác thực.

Trên iOS 15+, Security framework có sẵn với hỗ trợ khóa phần cứng qua Secure Enclave — bộ xử lý Apple chuyên dụng xử lý các thao tác mật mã và lưu trữ khóa riêng trong bộ nhớ cô lập. Secure Enclave hỗ trợ các thuật toán ECDSA (secp256r1) và ECDH để tạo các khóa không thể trích xuất từ chip.

API Data Protection

Data Protection là cơ chế iOS mã hóa từng tệp ở cấp hệ thống tệp (APFS) bằng khóa gắn với mã truy cập thiết bị. Nhà phát triển chỉ định mức bảo vệ qua thuộc tính NSFileProtectionType khi tạo tệp: NSFileProtectionComplete — tệp chỉ có thể truy cập khi thiết bị được mở khóa.

Data Protection hoạt động tự động trên tất cả các thiết bị chạy iOS 5+ nếu có mã truy cập được đặt. Mã hóa được thực hiện ở cấp phần cứng qua Dedicated AES Engine của bộ xử lý Apple, đảm bảo hiệu suất cao — độ trễ mã hóa hầu như không đáng kể đối với người dùng. Để bật bảo vệ trong ứng dụng, chỉ cần đặt thuộc tính bảo vệ khi tạo tệp qua FileManager.

Data Protection không thay thế Keychain để lưu trữ khóa — nó được sử dụng để mã hóa tệp, cơ sở dữ liệu Core Data và các khối lượng dữ liệu lớn khác. Sự kết hợp của Keychain (cho khóa) và Data Protection (cho tệp) cung cấp một chu trình lưu trữ an toàn hoàn chỉnh trên iOS.

Ví dụ mã: mã hóa dữ liệu trên Android và iOS

Hãy xem các ví dụ thực tế về Secure Storage sử dụng API tích hợp của Android và iOS.

EncryptedSharedPreferences trong Kotlin

Ví dụ cho thấy việc khởi tạo EncryptedSharedPreferences với khóa chính từ Android Keystore. Tất cả các thao tác đọc và ghi sau đó được tự động mã hóa và giải mã.

kotlin
import androidx.security.crypto.EncryptedSharedPreferences
import androidx.security.crypto.MasterKey

val masterKey = MasterKey.Builder(context)
    .setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
    .build()

val prefs = EncryptedSharedPreferences.create(
    context,
    "secure_prefs",
    masterKey,
    EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
    EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
)

prefs.edit()
    .putString("auth_token", "eyJhbGciOiJIUzI1NiJ9...")
    .apply()

Keychain trong Swift

Ví dụ minh họa việc lưu và đọc dữ liệu từ iOS Keychain bằng Security framework. Mã sử dụng kSecAttrAccessibleWhenUnlockedThisDeviceOnly để bảo vệ tối đa.

swift
import Security

func saveToKeychain(key: String, data: Data) {
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrAccount as String: key,
        kSecValueData as String: data,
        kSecAttrAccessible as String:
            kSecAttrAccessibleWhenUnlockedThisDeviceOnly
    ]
    SecItemDelete(query as CFDictionary)
    SecItemAdd(query as CFDictionary, nil)
}

func readFromKeychain(key: String) -> Data? {
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrAccount as String: key,
        kSecReturnData as String: true,
        kSecMatchLimit as String: kSecMatchLimitOne
    ]
    var result: AnyObject?
    let status = SecItemCopyMatching(
        query as CFDictionary, &result
    )
    return status == errSecSuccess ? result as? Data : nil
}

SQLCipher trong Kotlin

Một ví dụ về kết nối đến cơ sở dữ liệu SQLite đã mã hóa qua SQLCipher với mật khẩu được lưu trong Android Keystore.

kotlin
import net.sqlcipher.database.SQLiteDatabase
import net.sqlcipher.database.SQLiteOpenHelper

class SecureDBHelper(context: Context) :
    SQLiteOpenHelper(context, "secure.db", null, 1) {

    private val password = getKeyFromKeystore()

    override fun onCreate(db: SQLiteDatabase) {
        db.execSQL("CREATE TABLE tokens (id INTEGER PRIMARY KEY, value TEXT)")
    }

    override fun onUpgrade(
        db: SQLiteDatabase, oldVersion: Int, newVersion: Int
    ) {
        onCreate(db)
    }
}

// Cách dùng: truyền mật khẩu khi mở
val helper = SecureDBHelper(context)
val db = helper.getWritableDatabase(password)

Khuyến nghị lưu trữ dữ liệu an toàn

Việc sử dụng đúng cách Secure Storage đòi hỏi tuân theo một số nguyên tắc cơ bản nhằm ngăn chặn các lỗi phát triển phổ biến.

Xác định phân loại dữ liệu: dữ liệu nào cần bảo vệ phần cứng (Keystore / Secure Enclave), dữ liệu nào cần mã hóa ở cấp hệ điều hành (EncryptedSharedPreferences / Data Protection), và dữ liệu nào có thể được lưu trữ trong hệ thống tệp thông thường. Token xác thực, khóa riêng và dữ liệu thanh toán — chỉ cấp phần cứng. Cài đặt người dùng (chủ đề, ngôn ngữ) — EncryptedSharedPreferences là đủ. Dữ liệu phiên (bộ nhớ đệm tạm thời) có thể được lưu trong bộ nhớ hoặc thư mục tạm thời.

Không bao giờ lưu trữ bí mật trong mã: chuỗi có khóa API, mật khẩu hoặc cụm từ khởi tạo trong mã nguồn là một lỗi bảo mật nghiêm trọng. Bất kỳ kỹ thuật đảo ngược nào cũng sẽ ngay lập tức tiết lộ dữ liệu này. Sử dụng Keystore cho khóa, và cho cấu hình — tải từ phía máy chủ khi khởi động ứng dụng (cấu hình từ xa).

Sử dụng liên kết sinh trắc học cho các thao tác quan trọng: Android Keystore và iOS Keychain hỗ trợ liên kết khóa với xác thực sinh trắc học. Mỗi khi khóa được truy cập, hệ thống sẽ yêu cầu Face ID, Touch ID hoặc sinh trắc học Android (BiometricPrompt). Điều này đảm bảo rằng ngay cả khi có toàn quyền kiểm soát thiết bị, kẻ tấn công không thể sử dụng dữ liệu đã lưu mà không có chủ sở hữu.

Kiểm tra bảo mật: sử dụng công cụ phân tích bảo mật — MobSF (Mobile Security Framework) cho phân tích tĩnh, objection cho kiểm tra thời gian chạy và Frida để vượt qua bảo vệ. Xác minh rằng dữ liệu không thể truy cập sau khi root hoặc jailbreak. Android cho phép kiểm tra quyền truy cập root qua SafetyNet Attestation hoặc Play Integrity API, iOS — qua xác minh tính toàn vẹn của Secure Enclave.

Thường xuyên cập nhật các thư viện mật mã: các lỗ hổng trong thư viện mã hóa được phát hiện thường xuyên. Theo dõi CVE cho AndroidX Security, SQLCipher và trình bao bọc Keychain. Triển khai hệ thống thông báo tự động về các phiên bản mới qua Dependabot hoặc Renovate.

Theo Apple Security Research (2025), việc triển khai đúng cách Secure Storage ngăn chặn 96% các cuộc tấn công nhằm đánh cắp dữ liệu từ thiết bị. 4% còn lại là các cuộc tấn công có truy cập vật lý và khai thác zero-day, mà liên kết sinh trắc học có hiệu quả chống lại.

Câu hỏi thường gặp

Sự khác biệt giữa Keychain và Keystore là gì?

iOS Keychain là cơ sở dữ liệu đã mã hóa để lưu trữ mật khẩu, khóa và chứng chỉ với kiểm soát truy cập qua ACL. Android Keystore là nhà cung cấp mật mã tạo và lưu trữ khóa trong môi trường cô lập (TEE/StrongBox) và không cho phép trích xuất khóa riêng.

EncryptedSharedPreferences sử dụng thuật toán mã hóa nào?

EncryptedSharedPreferences sử dụng AES-256 GCM để mã hóa giá trị và AES-256 SIV để mã hóa khóa. Khóa chính được lưu trong Android Keystore, cung cấp bảo vệ hai cấp. Ngoài ra, HMAC-SHA256 được sử dụng để xác minh tính toàn vẹn.

Tôi có cần mã hóa dữ liệu đã được bảo vệ bởi HTTPS không?

Có, HTTPS chỉ bảo vệ dữ liệu trong kênh truyền. Trên thiết bị, dữ liệu được lưu dưới dạng văn bản thuần túy sau khi giải mã. Nếu kẻ tấn công có quyền truy cập vật lý vào thiết bị hoặc cài đặt phần mềm độc hại, HTTPS sẽ không bảo vệ dữ liệu đã lưu. Luôn mã hóa dữ liệu ở cấp lưu trữ.

Làm thế nào để bảo vệ dữ liệu sau khi root Android?

Sử dụng Android Keystore với cờ setUnlockedDeviceRequired(true), chặn quyền truy cập khóa trên các thiết bị đã root. Ngoài ra, xác minh tính toàn vẹn qua Play Integrity API và nếu lệch khỏi giá trị tham chiếu, hãy xóa tất cả bí mật khỏi kho lưu trữ.

Tôi có thể sử dụng UserDefaults để lưu trữ token trên iOS không?

Không, UserDefaults lưu dữ liệu dưới dạng văn bản thuần túy trong tệp plist bên trong sandbox. Bất kỳ ứng dụng nào có công cụ kỹ thuật đảo ngược (qua sao lưu hoặc jailbreak) cũng có thể đọc được token. Chỉ Keychain mới là nơi an toàn duy nhất để lưu trữ bí mật trên iOS.

Tóm tắt

  • Secure Storage là thành phần thiết yếu của bảo vệ ứng dụng di động, ngăn chặn rò rỉ dữ liệu khi có truy cập vật lý vào thiết bị.
  • Android Keystore với StrongBox cung cấp lưu trữ khóa phần cứng trên chip bảo mật chuyên dụng.
  • iOS Keychain với các lớp bảo vệ (WhenUnlockedThisDeviceOnly) là tiêu chuẩn lưu trữ bí mật trên nền tảng Apple.
  • EncryptedSharedPreferences là giải pháp có sẵn để mã hóa cài đặt và token trên Android với mật mã hai cấp.
  • SQLCipher là lựa chọn cho cơ sở dữ liệu đã mã hóa với mã hóa AES-256-CBC từng trang.
  • Data Protection trên iOS và SafetyNet/Play Integrity trên Android là các lớp bảo vệ hệ thống tệp bổ sung.
  • Phân loại dữ liệu đúng cách và liên kết sinh trắc học ngăn chặn 96% các cuộc tấn công vào dữ liệu đã lưu theo Apple Security Research.

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.

Thảo luận dự án

Đọc thêm