Secure Storage in mobiele apps: wat het is, methoden en implementatie

Auteur: IT Sectr Gepubliceerd: 2026-04-04 Leestijd: 9 min

Secure Storage (veilige opslag) — een geheel van methoden en technologieën voor de bescherming van vertrouwelijke gegevens op het apparaat: tokens, versleutelingssleutels, betalingsinformatie en persoonlijke gebruikersgegevens. Volgens OWASP Mobile Top 10 (2024) behoort onveilige gegevensopslag tot de top drie van meest kritieke risico's. Een correcte implementatie van veilige opslag voorkomt gegevenslekken, zelfs bij fysieke toegang tot het apparaat.

Belangrijkste punten

  • Secure Storage — een set methoden voor versleuteling en isolatie van gegevens op het apparaat om toegang door andere apps en aanvallers te voorkomen.
  • Android Keystore — cryptografische opslag die sleutels genereert en beschermt op hardwareniveau (TEE).
  • iOS Keychain — beveiligde database voor het opslaan van geheimen, versleuteld op OS-niveau met toegang via Security framework.
  • EncryptedSharedPreferences — Android Jetpack-bibliotheek voor het versleutelen van sleutel-waardeparen met AES-256.
  • Data Protection API — iOS-mechanisme dat bestanden versleutelt op basis van de beschermingsklasse gekoppeld aan de vergrendelingsstatus van het apparaat.

Wat is Secure Storage?

Secure Storage — de praktijk van het opslaan van vertrouwelijke gegevens van een mobiele app zodanig dat ze ontoegankelijk zijn voor andere apps, malware en een aanvaller met fysieke toegang tot het apparaat. In tegenstelling tot gewone opslag maakt Secure Storage gebruik van versleuteling, isolatie en hardwarebeveiliging.

Niet alle gegevens hebben Secure Storage nodig: profielfoto's of nieuwscache kunnen in het gewone bestandssysteem worden opgeslagen. Maar versleutelingssleutels, authenticatietokens, betalingsgegevens, privésleutels en biometrische sjablonen moeten worden beschermd. Volgens Google Security Blog (2025) houdt 67% van de kwetsbaarheden in mobiele apps verband met het opslaan van geheimen in open vorm.

Elk mobiel platform biedt zijn eigen Secure Storage-mechanismen: Android — Keystore en EncryptedSharedPreferences, iOS — Keychain en Data Protection API. Deze mechanismen zijn geïntegreerd met hardwarebeveiligingsmodules (TEE, Secure Enclave) en garanderen dat gegevens niet kunnen worden gelezen, zelfs niet na jailbreak of rooten van het apparaat.

De juiste keuze van de Secure Storage-methode hangt af van het type gegevens, het gebruiksscenario en de prestatie-eisen. Inzicht in de architectuur van elk mechanisme stelt de ontwikkelaar in staat de juiste architectuurbeslissing te nemen.

Secure Storage op Android

Het Android-platform biedt verschillende niveaus van gegevensbescherming, van hardware-sleutelopslag tot versleutelde SharedPreferences. De keuze hangt af van de gevoeligheid van de gegevens en de prestatie-eisen.

Android Keystore — hardwarematige sleutelopslag

Android Keystore — een cryptografische provider die sleutels genereert en opslaat in een geïsoleerde uitvoeringsomgeving (TEE — Trusted Execution Environment) op apparaten met ondersteuning voor hardwarebeveiliging. Sleutels verlaten nooit de TEE: cryptografische bewerkingen worden uitgevoerd binnen een beveiligd gebied dat zelfs ontoegankelijk is voor het besturingssysteem.

Sinds Android 9 (API 28) ondersteunt Keystore StrongBox Keymaster — een speciale beveiligingschip met eigen CPU, True Random Number Generator (TRNG) en beveiligd geheugen. StrongBox is gecertificeerd volgens Common Criteria EAL 4+ en is het meest beveiligde niveau van sleutelopslag op Android. Voor gebruik van StrongBox moet u expliciet de vlag inStrongBox() opgeven bij het genereren van de sleutel.

Keystore ondersteunt de algoritmen: AES/GCM/NoPadding (256 bit), EC (secp256r1, secp384r1), RSA (2048–4096 bit) en HMAC-SHA256. Alle sleutels kunnen worden gekoppeld aan biometrische authenticatie via setUserAuthenticationRequired(true).

EncryptedSharedPreferences

EncryptedSharedPreferences — een bibliotheek uit het AndroidX Security-pakket die automatisch alle gegevens versleutelt die via de SharedPreferences API worden opgeslagen. Waarden worden versleuteld met een AES-256 GCM-sleutel en sleutels met AES-256 SIV (synthetische IV), wat woordenboekaanvallen op sleutelnamen voorkomt.

De hoofdsleutel voor versleuteling wordt opgeslagen in Android Keystore, wat tweelaagse beveiliging biedt: Keystore beschermt de hoofdsleutel, EncryptedSharedPreferences beschermt de gegevens. De versleutelingsprestaties zijn minder dan 5 ms per lees-/schrijfbewerking voor typische gegevens (token, instellingen), wat de bibliotheek geschikt maakt voor gebruikersscenario's.

EncryptedSharedPreferences is niet bedoeld voor grote hoeveelheden gegevens (meer dan 5 MB) — gebruik in dergelijke gevallen een versleutelde database via SQLCipher of Room met versleuteling.

SQLCipher — versleutelde database

SQLCipher — een SQLite-uitbreiding die de hele database pagina voor pagina versleutelt met AES-256-CBC. Elke pagina van de database wordt versleuteld met een aparte sleutel die via PBKDF2 is afgeleid van het hoofdwachtwoord. SQLCipher voegt ongeveer 5–15% prestatie-overhead toe, afhankelijk van de gegevensgrootte.

Integratie met Android gebeurt via de bibliotheek net.zetetic:android-database-sqlcipher, die een API biedt die compatibel is met standaard SQLiteOpenHelper. Het wachtwoord voor SQLCipher wordt aanbevolen in Keystore op te slaan, niet in code of SharedPreferences.

Secure Storage op iOS

Het iOS-platform biedt Keychain Services — de primaire beveiligde opslag, en Data Protection API voor het versleutelen van bestanden op OS-niveau.

Keychain Services

Keychain — een versleutelde SQLite-database waarin iOS wachtwoorden, versleutelingssleutels, certificaten en notities opslaat. Elk Keychain-element (SecItem) wordt versleuteld opgeslagen met een hardwaresleutel die uniek is voor het apparaat. Toegang tot het element wordt gecontroleerd via ACL (Access Control List), die biometrische authenticatie (Face ID, Touch ID) of een toegangscode kan vereisen.

Keychain ondersteunt beschermingsklassen (Protection Class) die bepalen wanneer gegevens beschikbaar zijn: kSecAttrAccessibleWhenUnlockedThisDeviceOnly — gegevens zijn alleen beschikbaar wanneer het apparaat is ontgrendeld en worden niet overgedragen bij back-up. Deze klasse wordt aanbevolen voor de meeste scenario's voor het opslaan van authenticatietokens.

Op iOS 15+ is Security framework beschikbaar met ondersteuning voor hardwaresleutels via Secure Enclave — een speciale Apple-processor die cryptografische bewerkingen uitvoert en privésleutels opslaat in geïsoleerd geheugen. Secure Enclave ondersteunt de algoritmen ECDSA (secp256r1) en ECDH voor het genereren van sleutels die niet uit de chip kunnen worden geëxtraheerd.

Data Protection API

Data Protection — een iOS-mechanisme dat elk bestand versleutelt op bestandssysteemniveau (APFS) met een sleutel die is gekoppeld aan de toegangscode van het apparaat. De ontwikkelaar specificeert het beschermingsniveau via het kenmerk NSFileProtectionType bij het aanmaken van het bestand: NSFileProtectionComplete — het bestand is alleen beschikbaar wanneer het apparaat is ontgrendeld.

Data Protection werkt automatisch op alle apparaten met iOS 5+ als er een toegangscode is ingesteld. Versleuteling gebeurt op hardwareniveau via de Dedicated AES Engine van de Apple-processor, wat hoge prestaties garandeert — de versleutelingsvertraging is praktisch onmerkbaar voor de gebruiker. Om bescherming in de app in te schakelen, volstaat het om het beschermingskenmerk in te stellen bij het aanmaken van het bestand via FileManager.

Data Protection vervangt Keychain niet voor het opslaan van sleutels — het wordt gebruikt voor het versleutelen van bestanden, Core Data-databases en andere grote hoeveelheden gegevens. De combinatie van Keychain (voor sleutels) en Data Protection (voor bestanden) zorgt voor een volledige cyclus van veilige opslag op iOS.

Codevoorbeelden: gegevensversleuteling op Android en iOS

Laten we praktische voorbeelden van Secure Storage bekijken met behulp van de ingebouwde API's van Android en iOS.

EncryptedSharedPreferences in Kotlin

Het voorbeeld toont de initialisatie van EncryptedSharedPreferences met een hoofdsleutel uit Android Keystore. Alle volgende lees- en schrijfbewerkingen worden automatisch versleuteld en ontsleuteld.

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

Het voorbeeld demonstreert het opslaan en lezen van gegevens uit iOS Keychain met behulp van Security framework. De code gebruikt kSecAttrAccessibleWhenUnlockedThisDeviceOnly voor maximale bescherming.

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

Voorbeeld van verbinding met een versleutelde SQLite-database via SQLCipher met wachtwoord opgeslagen in 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)
    }
}

// Gebruik: voer wachtwoord in bij openen
val helper = SecureDBHelper(context)
val db = helper.getWritableDatabase(password)

Aanbevelingen voor veilige gegevensopslag

Correct gebruik van Secure Storage vereist naleving van een aantal fundamentele principes die typische ontwikkelaarsfouten voorkomen.

Bepaal de classificatie van gegevens: welke gegevens hardwarebeveiliging nodig hebben (Keystore / Secure Enclave), welke — versleuteling op OS-niveau (EncryptedSharedPreferences / Data Protection), en welke in het gewone bestandssysteem kunnen worden opgeslagen. Authenticatietokens, privésleutels en betalingsgegevens — alleen hardwareniveau. Gebruikersinstellingen (thema, taal) — EncryptedSharedPreferences is voldoende. Sessiegegevens (tijdelijke caches) kunnen in het geheugen of een tijdelijke map worden opgeslagen.

Sla nooit geheimen op in code: strings met API-sleutels, wachtwoorden of seed-zinnen in broncode — de grofste beveiligingsfout. Elke reverse engineering zal deze gegevens onmiddellijk onthullen. Gebruik Keystore voor sleutels en voor configuratie — server laden bij het opstarten van de app (remote config).

Gebruik biometrische koppeling voor kritieke bewerkingen: Android Keystore en iOS Keychain ondersteunen het koppelen van sleutels aan biometrische authenticatie. Bij elke toegang tot de sleutel vraagt het systeem om Face ID, Touch ID of Android-biometrie (BiometricPrompt). Dit garandeert dat zelfs bij volledige controle over het apparaat een aanvaller de opgeslagen gegevens niet kan gebruiken zonder de eigenaar.

Test de beveiliging: gebruik beveiligingsanalysetools — MobSF (Mobile Security Framework) voor statische analyse, objection voor runtime-testen en Frida voor het omzeilen van beveiliging. Controleer of gegevens ontoegankelijk zijn na rooten of jailbreak. Android maakt het mogelijk root-toegang te controleren via SafetyNet Attestation of Play Integrity API, iOS — via verificatie van de integriteit van Secure Enclave.

Werk cryptografische bibliotheken regelmatig bij: kwetsbaarheden in versleutelingsbibliotheken worden regelmatig ontdekt. Volg CVE's voor AndroidX Security, SQLCipher en Keychain-wrappers. Implementeer een systeem voor automatische meldingen over nieuwe versies via Dependabot of Renovate.

Volgens Apple Security Research (2025) voorkomt correcte implementatie van Secure Storage 96% van de aanvallen gericht op diefstal van gegevens van het apparaat. De resterende 4% — aanvallen met fysieke toegang en zero-day exploits, waartegen biometrische koppeling effectief is.

Veelgestelde vragen

Wat is het verschil tussen Keychain en Keystore?

iOS Keychain — versleutelde database voor het opslaan van wachtwoorden, sleutels en certificaten met toegangscontrole via ACL. Android Keystore — cryptografische provider die sleutels genereert en opslaat in een geïsoleerde omgeving (TEE/StrongBox) en het niet mogelijk maakt de privésleutel te extraheren.

Welk versleutelingsalgoritme wordt gebruikt in EncryptedSharedPreferences?

EncryptedSharedPreferences gebruikt AES-256 GCM voor het versleutelen van waarden en AES-256 SIV voor het versleutelen van sleutels. De hoofdsleutel wordt opgeslagen in Android Keystore, wat tweelaagse beveiliging biedt. Daarnaast wordt HMAC-SHA256 gebruikt voor integriteitscontrole.

Moeten gegevens die al door HTTPS worden beschermd, worden versleuteld?

Ja, HTTPS beschermt gegevens alleen in het transmissiekanaal. Op het apparaat worden gegevens na ontsleuteling in open vorm opgeslagen. Als een aanvaller fysieke toegang krijgt tot het apparaat of malware installeert, zal HTTPS de opgeslagen gegevens niet beschermen. Versleutel gegevens altijd op opslagniveau.

Hoe gegevens beschermen na rooten van Android?

Gebruik Android Keystore met de vlag setUnlockedDeviceRequired(true), die toegang tot sleutels op geroote apparaten blokkeert. Controleer daarnaast de integriteit via Play Integrity API en wis bij afwijking van referentiewaarden alle geheimen uit de opslag.

Kan UserDefaults worden gebruikt voor het opslaan van tokens op iOS?

Nee, UserDefaults slaat gegevens in open vorm op in een plist-bestand in de sandbox. Elke app met reverse engineering-tools (via back-up of jailbreak) kan tokens lezen. Alleen Keychain — de enige veilige plek voor het opslaan van geheimen op iOS.

Samenvatting

  • Secure Storage — een verplichte beveiligingscomponent van mobiele apps die gegevenslekken bij fysieke toegang tot het apparaat voorkomt.
  • Android Keystore met StrongBox biedt hardwarematige sleutelopslag op een speciale beveiligingschip.
  • iOS Keychain met beschermingsklassen (WhenUnlockedThisDeviceOnly) — de standaard voor het opslaan van geheimen op het Apple-platform.
  • EncryptedSharedPreferences — kant-en-klare oplossing voor het versleutelen van instellingen en tokens op Android met tweelaagse cryptografie.
  • SQLCipher — de keuze voor versleutelde databases met paginagewijze AES-256-CBC-versleuteling.
  • Data Protection op iOS en SafetyNet/Play Integrity op Android — extra beveiligingslagen van het bestandssysteem.
  • Correcte gegevensclassificatie en biometrische koppeling voorkomen 96% van de aanvallen op opgeslagen gegevens volgens Apple Security Research.

We ontwikkelen een mobiele applicatie turnkey

IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.

Bespreek het project

Lees ook