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 wrapper-е. Уведите систем аутоматских обавештења о новим верзијама путем 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 датотеци унутар пешчаника. Свака апликација са алатима за реверс инжењеринг (путем резервне копије или 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. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође