Secure Storage (biztonságos tárolás) — módszerek és technológiák összessége a bizalmas adatok védelmére az eszközön: tokenek, titkosítási kulcsok, fizetési információk és a felhasználók személyes adatai. A OWASP Mobile Top 10 (2024) szerint az adatok nem biztonságos tárolása a három legkritikusabb kockázat közé tartozik. A biztonságos tárolás helyes megvalósítása megakadályozza az adatszivárgást még az eszközhöz való fizikai hozzáférés esetén is.
Főbb pontok
Secure Storage — a mobilalkalmazás bizalmas adatainak olyan módon történő tárolása, hogy azok más alkalmazások, rosszindulatú szoftverek és az eszközhöz fizikailag hozzáférő támadó számára hozzáférhetetlenek legyenek. A szokásos tárolással ellentétben a Secure Storage titkosítást, elkülönítést és hardveres védelmet használ.
Nem minden adat igényel Secure Storage-ot: a profilképek vagy a hírek gyorsítótára a szokásos fájlrendszerben tárolható. A titkosítási kulcsokat, hitelesítési tokeneket, fizetési adatokat, privát kulcsokat és biometrikus sablonokat azonban védeni kell. A Google Security Blog (2025) szerint a mobilalkalmazásokban található sebezhetőségek 67%-a a titkok nyílt formában történő tárolásával kapcsolatos.
Minden mobil platform saját Secure Storage mechanizmusokat kínál: Android — Keystore és EncryptedSharedPreferences, iOS — Keychain és Data Protection API. Ezek a mechanizmusok integrálva vannak a hardveres biztonsági modulokkal (TEE, Secure Enclave), és garantálják, hogy az adatok még jailbreak vagy rootolás után sem olvashatók.
A Secure Storage módszer helyes kiválasztása az adatok típusától, a használati forgatókönyvtől és a teljesítménykövetelményektől függ. Az egyes mechanizmusok architektúrájának megértése lehetővé teszi a fejlesztő számára a helyes architekturális döntés meghozatalát.
Az Android platform az adatvédelem több szintjét kínálja, a hardveres kulcstárolótól a titkosított SharedPreferences-ig. A választás az adatok érzékenységétől és a teljesítménykövetelményektől függ.
Android Keystore — kriptográfiai szolgáltató, amely elkülönített végrehajtási környezetben (TEE — Trusted Execution Environment) hoz létre és tárol kulcsokat a hardveres védelmet támogató eszközökön. A kulcsok soha nem hagyják el a TEE-t: a kriptográfiai műveletek a védett területen belül hajtódnak végre, amely még az operációs rendszer számára sem hozzáférhető.
Az Android 9-től (API 28) a Keystore támogatja a StrongBox Keymaster-t — egy dedikált biztonsági chipet saját CPU-val, True Random Number Generator-ral (TRNG) és védett memóriával. A StrongBox Common Criteria EAL 4+ tanúsítvánnyal rendelkezik, és ez a kulcstárolás legbiztonságosabb szintje Androidon. A StrongBox használatához explicit módon meg kell adni az inStrongBox() jelzőt a kulcs létrehozásakor.
A Keystore a következő algoritmusokat támogatja: AES/GCM/NoPadding (256 bit), EC (secp256r1, secp384r1), RSA (2048–4096 bit) és HMAC-SHA256. Minden kulcs kapcsolható biometrikus hitelesítéshez a setUserAuthenticationRequired(true) segítségével.
EncryptedSharedPreferences — az AndroidX Security csomagból származó könyvtár, amely automatikusan titkosítja a SharedPreferences API-n keresztül tárolt összes adatot. Az értékek AES-256 GCM kulccsal, a kulcsok pedig AES-256 SIV (szintetikus IV) segítségével vannak titkosítva, ami megakadályozza a szótári támadásokat a kulcsnevek ellen.
A fő titkosítási kulcs az Android Keystore-ban van tárolva, két szintű védelmet biztosítva: a Keystore védi a mesterkulcsot, az EncryptedSharedPreferences pedig az adatokat. A titkosítás teljesítménye tipikus adatok (token, beállítások) esetén kevesebb, mint 5 ms olvasási/írási műveletenként, ami alkalmassá teszi a könyvtárat felhasználói forgatókönyvekhez.
Az EncryptedSharedPreferences nem nagy adatmennyiségekhez (5 MB felett) készült — ilyen esetekben használjon titkosított adatbázist SQLCipher vagy Room segítségével titkosítással.
SQLCipher — SQLite kiterjesztés, amely a teljes adatbázist oldalanként titkosítja AES-256-CBC használatával. Az adatbázis minden oldala külön kulccsal van titkosítva, amely a PBKDF2 segítségével a mesterjelszóból származik. A SQLCipher körülbelül 5–15% teljesítménytöbbletet ad hozzá az adatok méretétől függően.
Az Androiddal való integráció a net.zetetic:android-database-sqlcipher könyvtáron keresztül történik, amely a szabványos SQLiteOpenHelper-rel kompatibilis API-t biztosít. Az SQLCipher jelszavát ajánlott a Keystore-ban tárolni, nem a kódban vagy a SharedPreferences-ben.
Az iOS platform a Keychain Services-t — a fő védett tárolót, valamint a Data Protection API-t kínálja a fájlok OS szintű titkosításához.
A Keychain egy titkosított SQLite adatbázis, amelyben az iOS jelszavakat, titkosítási kulcsokat, tanúsítványokat és jegyzeteket tárol. A Keychain minden eleme (SecItem) titkosított formában van tárolva, az eszközre jellemző hardveres kulcs használatával. Az elemhez való hozzáférést ACL (Access Control List) szabályozza, amely biometrikus hitelesítést (Face ID, Touch ID) vagy jelszót igényelhet.
A Keychain védelmi osztályokat (Protection Class) támogat, amelyek meghatározzák, hogy az adatok mikor érhetők el: kSecAttrAccessibleWhenUnlockedThisDeviceOnly — az adatok csak akkor érhetők el, ha az eszköz fel van oldva, és nem kerülnek átvitelre biztonsági mentéskor. Ez az osztály a hitelesítési tokenek tárolásának legtöbb forgatókönyvéhez ajánlott.
iOS 15+-on elérhető a Security framework a hardveres kulcsok támogatásával a Secure Enclave-en keresztül — egy dedikált Apple processzor, amely kriptográfiai műveleteket végez és privát kulcsokat tárol elkülönített memóriában. A Secure Enclave az ECDSA (secp256r1) és ECDH algoritmusokat támogatja olyan kulcsok létrehozásához, amelyek nem vonhatók ki a chipből.
A Data Protection egy iOS mechanizmus, amely minden fájlt a fájlrendszer szintjén (APFS) titkosít az eszköz jelszavához kötött kulcs segítségével. A fejlesztő a védelmi szintet az NSFileProtectionType attribútumon keresztül határozza meg a fájl létrehozásakor: NSFileProtectionComplete — a fájl csak feloldott eszközön érhető el.
A Data Protection automatikusan működik minden iOS 5+-os eszközön, ha jelszó van beállítva. A titkosítás hardver szinten történik az Apple processzor Dedicated AES Engine-jén keresztül, ami nagy teljesítményt biztosít — a titkosítás késleltetése gyakorlatilag észrevehetetlen a felhasználó számára. A védelem aktiválásához az alkalmazásban elegendő a védelmi attribútumot beállítani a fájl FileManageren keresztüli létrehozásakor.
A Data Protection nem helyettesíti a Keychain-t a kulcsok tárolásában — fájlok, Core Data adatbázisok és más nagy adatmennyiségek titkosítására szolgál. A Keychain (kulcsokhoz) és a Data Protection (fájlokhoz) kombinációja teljes biztonságos tárolási ciklust biztosít iOS-en.
Tekintsük át a Secure Storage gyakorlati példáit az Android és iOS beépített API-jainak használatával.
A példa az EncryptedSharedPreferences inicializálását mutatja az Android Keystore-ból származó mesterkulccsal. Az összes későbbi olvasási és írási művelet automatikusan titkosításra és visszafejtésre kerül.
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()
A példa az adatok iOS Keychain-ből történő mentését és olvasását mutatja be a Security framework használatával. A kód a kSecAttrAccessibleWhenUnlockedThisDeviceOnly-t használja a maximális védelem érdekében.
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
}
Példa titkosított SQLite adatbázishoz való csatlakozásra SQLCipher segítségével, az Android Keystore-ban tárolt jelszóval.
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)
}
}
// Használat: adja meg a jelszót nyitáskor
val helper = SecureDBHelper(context)
val db = helper.getWritableDatabase(password)
A Secure Storage helyes használata néhány alapelv betartását igényli, amelyek megakadályozzák a fejlesztők tipikus hibáit.
Határozza meg az adatok osztályozását: mely adatok igényelnek hardveres védelmet (Keystore / Secure Enclave), melyek — OS szintű titkosítást (EncryptedSharedPreferences / Data Protection), és melyek tárolhatók a szokásos fájlrendszerben. Hitelesítési tokenek, privát kulcsok és fizetési adatok — csak hardver szint. Felhasználói beállítások (téma, nyelv) — elég az EncryptedSharedPreferences. Munkamenet-adatok (ideiglenes gyorsítótárak) tárolhatók a memóriában vagy ideiglenes könyvtárban.
Soha ne tároljon titkokat a kódban: API-kulcsokat, jelszavakat vagy seed kifejezéseket tartalmazó karakterláncok a forráskódban — a legsúlyosabb biztonsági hiba. Bármilyen reverse engineering azonnal felfedi ezeket az adatokat. Használja a Keystore-t a kulcsokhoz, konfigurációhoz pedig szerverről történő betöltést az alkalmazás indításakor (remote config).
Kritikus műveletekhez használjon biometrikus kötést: Az Android Keystore és az iOS Keychain támogatja a kulcsok biometrikus hitelesítéshez való kötését. Minden kulcshozzáféréskor a rendszer Face ID-t, Touch ID-t vagy Android biometriát (BiometricPrompt) kér. Ez garantálja, hogy még az eszköz feletti teljes kontroll esetén sem használhatja a támadó a tárolt adatokat a tulajdonos nélkül.
Tesztelje a védelmet: használjon biztonsági elemző eszközöket — MobSF (Mobile Security Framework) statikus elemzéshez, objection futásidejű teszteléshez és Frida a védelem megkerüléséhez. Ellenőrizze, hogy az adatok hozzáférhetetlenek-e rootolás vagy jailbreak után. Az Android lehetővé teszi a root jelenlétének ellenőrzését SafetyNet Attestation vagy Play Integrity API segítségével, az iOS — a Secure Enclave integritásának ellenőrzésével.
Rendszeresen frissítse a kriptográfiai könyvtárakat: a titkosítási könyvtárakban rendszeresen fedeznek fel sebezhetőségeket. Kövesse a CVE-ket az AndroidX Security, SQLCipher és Keychain wrapperek számára. Vezessen be automatikus értesítési rendszert az új verziókról a Dependabot vagy Renovate segítségével.
Az Apple Security Research (2025) szerint a Secure Storage helyes megvalósítása megakadályozza az eszközről történő adatlopást célzó támadások 96%-át. A fennmaradó 4% — fizikai hozzáféréssel járó támadások és zero-day exploitok, amelyekkel szemben a biometrikus kötés hatékony.
Gyakran Ismételt Kérdések
iOS Keychain — titkosított adatbázis jelszavak, kulcsok és tanúsítványok tárolására ACL-en keresztüli hozzáférés-vezérléssel. Android Keystore — kriptográfiai szolgáltató, amely elkülönített környezetben (TEE/StrongBox) hoz létre és tárol kulcsokat, és nem teszi lehetővé a privát kulcs kinyerését.
Az EncryptedSharedPreferences AES-256 GCM-et használ az értékek titkosításához és AES-256 SIV-et a kulcsok titkosításához. A fő kulcs az Android Keystore-ban van tárolva, két szintű védelmet biztosítva. Ezenkívül HMAC-SHA256-ot használ az integritás ellenőrzéséhez.
Igen, a HTTPS csak az átviteli csatornán védi az adatokat. Az eszközön az adatok a visszafejtés után nyílt formában tárolódnak. Ha a támadó fizikai hozzáférést szerez az eszközhöz vagy rosszindulatú szoftvert telepít, a HTTPS nem védi a tárolt adatokat. Mindig titkosítsa az adatokat tárolási szinten.
Használja az Android Keystore-t a setUnlockedDeviceRequired(true) jelzővel, amely blokkolja a kulcsokhoz való hozzáférést rootolt eszközökön. Ezenkívül ellenőrizze az integritást a Play Integrity API-n keresztül, és a referenciaértékektől való eltérés esetén törölje az összes titkot a tárolóból.
Nem, a UserDefaults nyílt formában tárolja az adatokat egy plist fájlban a homokozóban. Bármely alkalmazás reverse engineering eszközökkel (biztonsági mentésen vagy jailbreak-en keresztül) olvashatja a tokeneket. Csak a Keychain — az egyetlen biztonságos hely a titkok tárolására iOS-en.
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is