Secure Storage в мобилните приложения: какво е, методи и реализация

Автор: IT Sectr Публикувано: 2026-04-04 Време за четене: 9 мин

Secure Storage (сигурно съхранение) — комплекс от методи и технологии за защита на поверителни данни на устройството: токени, криптиращи ключове, платежна информация и лични данни на потребителите. Според OWASP Mobile Top 10 (2024), несигурното съхранение на данни е сред трите най-критични риска. Правилната реализация на сигурното съхранение предотвратява изтичане на данни дори при физически достъп до устройството.

Основни неща

  • Secure Storage — набор от методи за криптиране и изолиране на данни на устройството за предотвратяване на достъп от други приложения и нападатели.
  • Android Keystore — криптографско хранилище, което генерира и защитава ключове на хардуерно ниво (TEE).
  • iOS Keychain — защитена база данни за съхранение на тайни, криптирана на ниво ОС с достъп чрез Security framework.
  • EncryptedSharedPreferences — библиотека на Android Jetpack за криптиране на двойки ключ-стойност с използване на AES-256.
  • Data Protection API — механизъм на iOS, който криптира файлове на базата на клас на защита, свързан със състоянието на заключване на устройството.

Какво е Secure Storage?

Secure Storage — практика за съхранение на поверителни данни на мобилно приложение по такъв начин, че да са недостъпни за други приложения, злонамерен софтуер и нападател при физически достъп до устройството. За разлика от обикновеното съхранение, Secure Storage използва криптиране, изолация и хардуерна защита.

Не всички данни изискват Secure Storage: профилни снимки или кеш на новини могат да се съхраняват в обикновената файлова система. Въпреки това, ключове за криптиране, токени за удостоверяване, платежни данни, частни ключове и биометрични шаблони трябва да бъдат защитени. Според Google Security Blog (2025), 67% от уязвимостите в мобилните приложения са свързани със съхранение на тайни в отворен вид.

Всяка мобилна платформа предоставя свои собствени механизми за Secure Storage: Android — Keystore и EncryptedSharedPreferences, iOS — Keychain и Data Protection API. Тези механизми са интегрирани с хардуерни модули за сигурност (TEE, Secure Enclave) и гарантират, че данните не могат да бъдат прочетени дори след jailbreak или руутване на устройството.

Правилният избор на метод за Secure Storage зависи от типа данни, сценария на използване и изискванията за производителност. Разбирането на архитектурата на всеки механизъм позволява на разработчика да вземе правилно архитектурно решение.

Secure Storage на Android

Платформата Android предоставя няколко нива на защита на данните, от хардуерно хранилище за ключове до криптирани SharedPreferences. Изборът зависи от чувствителността на данните и изискванията за производителност.

Android Keystore — хардуерно съхранение на ключове

Android Keystore — криптографски доставчик, който генерира и съхранява ключове в изолирана среда за изпълнение (TEE — Trusted Execution Environment) на устройства с поддръжка на хардуерна защита. Ключовете никога не напускат TEE: криптографските операции се изпълняват вътре в защитена зона, недостъпна дори за операционната система.

От Android 9 (API 28) Keystore поддържа StrongBox Keymaster — специален чип за сигурност със собствен CPU, генератор на истински случайни числа (TRNG) и защитена памет. StrongBox е сертифициран по Common Criteria EAL 4+ и е най-сигурното ниво за съхранение на ключове на Android. За използване на StrongBox трябва изрично да посочите флага inStrongBox() при генериране на ключа.

Keystore поддържа алгоритмите: AES/GCM/NoPadding (256 бита), EC (secp256r1, secp384r1), RSA (2048–4096 бита) и HMAC-SHA256. Всички ключове могат да бъдат свързани с биометрично удостоверяване чрез setUserAuthenticationRequired(true).

EncryptedSharedPreferences

EncryptedSharedPreferences — библиотека от пакета AndroidX Security, която автоматично криптира всички данни, съхранявани чрез SharedPreferences API. Стойностите се криптират с ключ AES-256 GCM, а ключовете — с AES-256 SIV (синтетичен IV), което предотвратява речникови атаки върху имената на ключовете.

Основният ключ за криптиране се съхранява в Android Keystore, осигурявайки двустепенна защита: Keystore защитава главния ключ, EncryptedSharedPreferences защитава данните. Производителността на криптиране е под 5 ms на операция четене/запис за типични данни (токен, настройки), което прави библиотеката подходяща за потребителски сценарии.

EncryptedSharedPreferences не е предназначена за големи обеми данни (над 5 MB) — в такива случаи използвайте криптирана база данни чрез SQLCipher или Room с криптиране.

SQLCipher — криптирана база данни

SQLCipher — разширение на SQLite, което криптира цялата база данни страница по страница с AES-256-CBC. Всяка страница от базата данни се криптира с отделен ключ, получен от главната парола чрез PBKDF2. SQLCipher добавя около 5–15% допълнително натоварване в зависимост от размера на данните.

Интеграцията с Android се осъществява чрез библиотеката net.zetetic:android-database-sqlcipher, която предоставя API, съвместим със стандартния SQLiteOpenHelper. Паролата за SQLCipher се препоръчва да се съхранява в Keystore, а не в код или SharedPreferences.

Secure Storage на iOS

Платформата iOS предоставя Keychain Services — основното защитено хранилище, както и Data Protection API за криптиране на файлове на ниво ОС.

Keychain Services

Keychain — криптирана SQLite база данни, в която iOS съхранява пароли, ключове за криптиране, сертификати и бележки. Всеки елемент на Keychain (SecItem) се съхранява в криптиран вид с използване на хардуерен ключ, уникален за устройството. Достъпът до елемента се контролира чрез ACL (Access Control List), който може да изисква биометрично удостоверяване (Face ID, Touch ID) или код за достъп.

Keychain поддържа класове на защита (Protection Class), които определят кога данните са достъпни: kSecAttrAccessibleWhenUnlockedThisDeviceOnly — данните са достъпни само когато устройството е отключено и не се прехвърлят при архивиране. Този клас се препоръчва за повечето сценарии за съхранение на токени за удостоверяване.

На iOS 15+ е наличен Security framework с поддръжка на хардуерни ключове чрез Secure Enclave — специален процесор на Apple, който обработва криптографски операции и съхранява частни ключове в изолирана памет. Secure Enclave поддържа алгоритмите ECDSA (secp256r1) и ECDH за генериране на ключове, които не могат да бъдат извлечени от чипа.

Data Protection API

Data Protection — механизъм на iOS, който криптира всеки файл на ниво файлова система (APFS) с ключ, свързан с кода за достъп на устройството. Разработчикът определя нивото на защита чрез атрибута NSFileProtectionType при създаване на файла: NSFileProtectionComplete — файлът е достъпен само когато устройството е отключено.

Data Protection работи автоматично на всички устройства с iOS 5+, ако е зададен код за достъп. Криптирането се извършва на хардуерно ниво чрез Dedicated AES Engine на процесора Apple, което осигурява висока производителност — забавянето на криптирането е практически незабележимо за потребителя. За активиране на защитата в приложението е достатъчно да зададете атрибута за защита при създаване на файла чрез FileManager.

Data Protection не замества Keychain за съхранение на ключове — използва се за криптиране на файлове, Core Data бази данни и други големи обеми данни. Комбинацията от Keychain (за ключове) и Data Protection (за файлове) осигурява пълен цикъл на сигурно съхранение на iOS.

Примери за код: криптиране на данни на Android и iOS

Нека разгледаме практически примери за Secure Storage с използване на вградените API на Android и iOS.

EncryptedSharedPreferences в Kotlin

Примерът показва инициализация на EncryptedSharedPreferences с главен ключ от Android Keystore. Всички последващи операции за четене и запис се криптират и декриптират автоматично.

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 в Swift

Примерът демонстрира записване и четене на данни от iOS Keychain с използване на Security framework. Кодът използва kSecAttrAccessibleWhenUnlockedThisDeviceOnly за максимална защита.

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 в Kotlin

Пример за свързване към криптирана SQLite база данни чрез SQLCipher с парола, съхранявана в 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)
    }
}

// Употреба: въведете парола при отваряне
val helper = SecureDBHelper(context)
val db = helper.getWritableDatabase(password)

Препоръки за сигурно съхранение на данни

Правилното използване на Secure Storage изисква спазване на няколко основни принципа, които предотвратяват типични грешки на разработчиците.

Определете класификацията на данните: кои данни изискват хардуерна защита (Keystore / Secure Enclave), кои — криптиране на ниво ОС (EncryptedSharedPreferences / Data Protection) и кои могат да се съхраняват в обикновената файлова система. Токени за удостоверяване, частни ключове и платежни данни — само хардуерно ниво. Потребителски настройки (тема, език) — достатъчен е EncryptedSharedPreferences. Данни за сесия (временни кешове) могат да се съхраняват в паметта или временна директория.

Никога не съхранявайте тайни в кода: низове с API ключове, пароли или seed фрази в изходния код — най-грубата грешка в сигурността. Всеки reverse engineering веднага ще разкрие тези данни. Използвайте Keystore за ключове, а за конфигурация — зареждане от сървър при стартиране на приложението (remote config).

Използвайте биометрично свързване за критични операции: Android Keystore и iOS Keychain поддържат свързване на ключове с биометрично удостоверяване. При всеки достъп до ключа системата изисква Face ID, Touch ID или Android биометрия (BiometricPrompt). Това гарантира, че дори при пълен контрол над устройството, нападателят не може да използва съхранените данни без собственика.

Тествайте защитата: използвайте инструменти за анализ на сигурността — MobSF (Mobile Security Framework) за статичен анализ, objection за runtime тестване и Frida за заобикаляне на защитата. Проверете дали данните са недостъпни след руутване или jailbreak. Android позволява проверка на наличие на root достъп чрез SafetyNet Attestation или Play Integrity API, iOS — чрез проверка на целостта на Secure Enclave.

Редовно актуализирайте криптографските библиотеки: уязвимости в библиотеките за криптиране се откриват редовно. Следете CVE за AndroidX Security, SQLCipher и обвивките на Keychain. Въведете система за автоматични известия за нови версии чрез Dependabot или Renovate.

Според Apple Security Research (2025), правилната реализация на Secure Storage предотвратява 96% от атаките, насочени към кражба на данни от устройството. Останалите 4% — атаки с физически достъп и експлойти от нулев ден, срещу които биометричното свързване е ефективно.

Често задавани въпроси

Каква е разликата между Keychain и Keystore?

iOS Keychain — криптирана база данни за съхранение на пароли, ключове и сертификати с контрол на достъпа чрез ACL. Android Keystore — криптографски доставчик, който генерира и съхранява ключове в изолирана среда (TEE/StrongBox) и не позволява извличане на частния ключ.

Какъв алгоритъм за криптиране се използва в EncryptedSharedPreferences?

EncryptedSharedPreferences използва AES-256 GCM за криптиране на стойности и AES-256 SIV за криптиране на ключове. Основният ключ се съхранява в Android Keystore, осигурявайки двустепенна защита. Допълнително се използва HMAC-SHA256 за проверка на целостта.

Трябва ли да се криптират данни, които вече са защитени от HTTPS?

Да, HTTPS защитава данните само в канала за предаване. На устройството данните се съхраняват в отворен вид след декриптиране. Ако нападател получи физически достъп до устройството или инсталира злонамерен софтуер, HTTPS няма да защити съхранените данни. Винаги криптирайте данните на ниво съхранение.

Как да защитим данни след руутване на Android?

Използвайте Android Keystore с флаг setUnlockedDeviceRequired(true), който блокира достъпа до ключове на руутвани устройства. Допълнително проверявайте целостта чрез Play Integrity API и при отклонение от референтните стойности изчистете всички тайни от хранилището.

Може ли да се използва UserDefaults за съхранение на токени на iOS?

Не, UserDefaults съхранява данни в отворен вид в plist файл в пясъчната среда. Всяко приложение с инструменти за reverse engineering (чрез архивиране или jailbreak) може да прочете токените. Само Keychain — единственото сигурно място за съхранение на тайни на iOS.

Резюме

  • Secure Storage — задължителен компонент за защита на мобилни приложения, предотвратяващ изтичане на данни при физически достъп до устройството.
  • Android Keystore с StrongBox осигурява хардуерно съхранение на ключове на специален чип за сигурност.
  • iOS Keychain с класове на защита (WhenUnlockedThisDeviceOnly) — стандартът за съхранение на тайни на платформата Apple.
  • EncryptedSharedPreferences — готово решение за криптиране на настройки и токени на Android с двустепенна криптография.
  • SQLCipher — изборът за криптирани бази данни с постранично AES-256-CBC криптиране.
  • Data Protection на iOS и SafetyNet/Play Integrity на Android — допълнителни нива на защита на файловата система.
  • Правилната класификация на данните и биометричното свързване предотвратяват 96% от атаките върху съхранените данни според Apple Security Research.

Ще разработим мобилно приложение под ключ

IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.

Обсъдете проекта

Прочетете също