EncryptedSharedPreferences: Was es ist, API und wie man es verwendet

Autor: IT Sectr Veröffentlicht: 2026-03-14 Lesezeit: 10 Min.

EncryptedSharedPreferences ist eine Komponente der AndroidX Security-Bibliothek, die eine transparente Verschlüsselung der über die SharedPreferences-API gespeicherten Daten bietet. Im Gegensatz zu normalen SharedPreferences, bei denen Daten in einer einfachen XML-Datei gespeichert werden, verschlüsselt EncryptedSharedPreferences automatisch Schlüssel und Werte vor dem Schreiben auf die Festplatte. Laut Android Developers verwendet die Bibliothek AES-256 GCM für Werte und AES-256 SIV (RFC 5297) für Schlüssel, um die Vertraulichkeit und Integrität der Daten zu gewährleisten.

Wichtige Punkte

  • EncryptedSharedPreferences — ein Wrapper über SharedPreferences mit automatischer Verschlüsselung aller gespeicherten Daten
  • Verschlüsselung verwendet AES-256 GCM für Werte und AES-256 SIV für Schlüssel über Android Keystore
  • Authenticated Encryption (AEAD) garantiert, dass Daten nach dem Schreiben nicht verändert wurden
  • Master Key wird in Android Keystore gespeichert und ist auf Geräten mit TEE hardwaregeschützt
  • API ist vollständig kompatibel mit SharedPreferences — der Austausch erfolgt ohne Änderung des Lese- und Schreibcodes

Was ist EncryptedSharedPreferences?

EncryptedSharedPreferences ist eine Klasse aus dem Paket androidx.security.crypto, eingeführt in AndroidX Security 1.0.0 (2019). Sie implementiert das SharedPreferences-Interface, aber alle Schreiboperationen (putString, putInt, putBoolean, usw.) verschlüsseln Daten vorab, und Leseoperationen entschlüsseln sie vor der Rückgabe.

Das Problem normaler SharedPreferences

Standardmäßige SharedPreferences speichern Daten in einer XML-Datei im App-Verzeichnis (/data/data/package/shared_prefs/). Die Datei ist nicht verschlüsselt — bei Root-Zugriff auf das Gerät oder bei der Analyse von Backups werden alle Daten als einfaches XML gelesen. Authentifizierungstoken, API-Schlüssel und persönliche Benutzerdaten werden für Angreifer zugänglich.

EncryptedSharedPreferences löst dieses Problem auf Bibliotheksebene: Daten werden vor dem Schreiben auf die Festplatte verschlüsselt und beim Lesen entschlüsselt. Der Entwickler muss keine kryptografischen Funktionen manuell aufrufen — die API bleibt identisch mit normalen SharedPreferences.

Geschichte und Versionen

Die AndroidX Security-Bibliothek v1.0.0 wurde im Dezember 2019 veröffentlicht. EncryptedSharedPreferences ersetzte den veralteten Ansatz der manuellen Verschlüsselung über Cipher + SharedPreferences. Die aktuelle stabile Version ist 1.1.0-alpha06 (2024) und unterstützt API 19+. Die Bibliothek ist Teil von Jetpack und erfordert keine zusätzlichen Berechtigungen.

Laut Google Security Blog (2024) ist EncryptedSharedPreferences die empfohlene Methode zum Speichern vertraulicher App-Einstellungen, die keine Cloud-Synchronisierung erfordern. Für komplexere Szenarien wird Room mit SQLCipher-Verschlüsselung empfohlen.

Wie funktioniert EncryptedSharedPreferences?

EncryptedSharedPreferences verwendet ein zweistufiges Verschlüsselungsschema: Der Master Key wird in Android Keystore gespeichert, und abgeleitete Schlüssel werden für die Datenverschlüsselung verwendet. Dies kombiniert den Keystore-Schutz mit der Leistung symmetrischer Verschlüsselung.

Verschlüsselungsschema: AES-256 GCM + SIV

Für Werte wird AES-256 GCM (Galois/Counter Mode) verwendet — ein authentifizierter Verschlüsselungsmodus (AEAD), der Vertraulichkeit und Integrität der Daten gewährleistet. Für Schlüssel (Parameternamen) wird AES-256 SIV (RFC 5297) angewendet — eine deterministische Verschlüsselung, die für die Schlüsselsuche erforderlich ist, ohne deren Inhalt preiszugeben.

Jede Datei von EncryptedSharedPreferences enthält verschlüsselte Schlüssel-Wert-Paare. Die Dateistruktur umfasst: zuerst einen Header mit Metadaten (Version, Schlüsselidentifikator), dann eine Liste verschlüsselter Einträge. Die Datei ist kein gültiges XML und kann mit Texteditoren nicht gelesen werden.

MasterKey und KeyStore

Die Klasse MasterKey ist für die Erstellung und Verwaltung eines 256-Bit-Masterschlüssels verantwortlich, der in Android Keystore gespeichert wird. MasterKey.Builder ermöglicht die Konfiguration von: Speichertyp (Keystore oder Software), biometrischem Schutz und Schlüssellebensdauer. Standardmäßig wird der Masterschlüssel in Android Keystore mit dem Algorithmus AES/GCM/NoPadding generiert.

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

fun getEncryptedPrefs() {
    val masterKey = MasterKey.Builder(context)
        .setKeyScheme(MasterKey.AES256_GCM_SPEC)
        .build()

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

Einrichtung und Konfiguration der Verschlüsselung

EncryptedSharedPreferences.create akzeptiert fünf Parameter: Kontext, Dateiname, Masterschlüssel, Schlüsselverschlüsselungsschema und Wertverschlüsselungsschema. Die Wahl der Schemata beeinflusst Leistung und Sicherheitsniveau.

Schlüsselverschlüsselungsschemata

AES256_SIV — deterministische Verschlüsselung: identische Schlüssel erzeugen immer denselben Chiffretext. Dies ist für die Schlüsselsuche erforderlich (SharedPreferences.getX(key)). Nachteil: Ein Angreifer kann durch den Vergleich wiederholter Chiffretexte feststellen, welche Schlüssel verwendet werden. AES256_SIV2 — eine verbesserte Version mit zusätzlicher Randomisierung.

Für Werte wird AES256_GCM verwendet. GCM fügt jedem Wert einen 12-Byte-IV (Initialisierungsvektor) und einen 16-Byte-Authentifizierungstag hinzu. Dies gewährleistet Vertraulichkeit (niemand kann den Wert lesen) und Authentifizierung (niemand kann den Wert unbemerkt verändern).

Biometrischer Schutz des Masterschlüssels

Die Methode setUserAuthenticationRequired(true) in MasterKey.Builder erfordert eine biometrische Bestätigung, bevor der Masterschlüssel aus dem Keystore abgerufen wird. Dies fügt eine zusätzliche Ebene hinzu: Selbst wenn die App auf einem entsperrten Gerät ausgeführt wird, kann ein Angreifer EncryptedSharedPreferences nicht ohne Face ID oder Touch ID lesen.

Wichtig: Bei setUserAuthenticationRequired wird der Masterschlüssel unbrauchbar, wenn der Benutzer die Biometrie ändert oder löscht. KeyPermanentlyInvalidatedException muss behandelt und ein neuer Masterschlüssel mit Datenmigration erstellt werden.

kotlin
fun createBiometricKey(): MasterKey {
    return MasterKey.Builder(context)
        .setKeyScheme(MasterKey.AES256_GCM_SPEC)
        .setUserAuthenticationRequired(true)
        .setRequestStrongBoxBacked(true)
        .build()
}

fun writeSecureToken(token: String) {
    try {
        prefs.edit().putString("auth_token", token).apply()
    } catch (e: KeyPermanentlyInvalidatedException) {
        // Biometrie hat sich geändert — Schlüssel muss neu erstellt werden
    }
}

Beispiel zur Verwendung in Kotlin

Schauen wir uns ein vollständiges Beispiel zur Integration von EncryptedSharedPreferences in einer Android-App mit Kotlin an. Die Bibliothek androidx.security:security-crypto wird über Gradle hinzugefügt.

Abhängigkeit hinzufügen

Fügen Sie in der Datei build.gradle (app) hinzu: implementation „androidx.security:security-crypto:1.1.0-alpha06“. Für Kotlin-Projekte wird zusätzlich kotlin-stdlib benötigt. Die MasterKey-Initialisierung erfolgt einmalig, normalerweise in Application.onCreate oder über einen DI-Container.

Daten lesen und schreiben

Nach der Erstellung einer EncryptedSharedPreferences-Instanz unterscheidet sich die API nicht von normalen SharedPreferences. edit() gibt einen Editor zurück, alle Methoden (putString, getString, putBoolean, getBoolean) funktionieren gleich. Der einzige Unterschied ist intern: Daten werden beim Schreiben verschlüsselt und beim Lesen entschlüsselt.

kotlin
class AuthRepository(context: Context) {
    private val prefs = createEncryptedPrefs(context)

    fun saveCredentials(login: String, password: String) {
        prefs.edit()
            .putString("login", login)
            .putString("password", password)
            .apply()
    }

    fun getToken(): String? {
        return prefs.getString("auth_token", null)
    }

    fun clearAll() {
        prefs.edit().clear().apply()
    }
}

Migration von normalen SharedPreferences

Zur Migration vorhandener Daten aus unverschlüsselten SharedPreferences in EncryptedSharedPreferences müssen Sie: alle Daten aus der alten Datei lesen, eine neue EncryptedSharedPreferences erstellen, alle Daten schreiben und die alte Datei löschen. Google stellt keinen integrierten Migrator bereit — der Entwickler implementiert ihn manuell.

Vergleich mit normalen SharedPreferences

Die Wahl zwischen SharedPreferences und EncryptedSharedPreferences hängt von der Art der gespeicherten Daten ab. Für UI-Einstellungen (Design, Sprache, Sortierung) sind normale SharedPreferences ausreichend. Für vertrauliche Informationen (Token, Passwörter, Schlüssel) ist EncryptedSharedPreferences obligatorisch.

Leistung

EncryptedSharedPreferences ist aufgrund kryptografischer Operationen langsamer als normale. Das Schreiben eines einzelnen Zeichenfolgenwerts dauert ~5-15 ms (abhängig von der Datengröße und AES-Hardwarebeschleunigung). Das Lesen dauert 2-5 ms. Für die meisten Apps ist dies nicht spürbar, aber bei Batch-Operationen (Migration, Wiederherstellung) sollte apply() statt commit() verwendet werden.

Sicherheit

Normale SharedPreferences bieten keinen kryptografischen Schutz: Die XML-Datei kann von jedem Prozess mit Root-Zugriff oder über adb backup gelesen werden. EncryptedSharedPreferences verschlüsselt Daten auf Anwendungsebene, und der Masterschlüssel wird in Android Keystore mit optionalem Hardwareschutz (StrongBox) gespeichert.

EigenschaftSharedPreferencesEncryptedSharedPreferences
SpeicherungEinfaches XMLVerschlüsselte Binärdatei
VerschlüsselungKeineAES-256 GCM + SIV
SchlüsselschutzKeinerAndroid Keystore + StrongBox
Leistung0.1-1 ms2-15 ms
EmpfehlungUI-EinstellungenToken, Schlüssel, PII

Wann EncryptedSharedPreferences wählen

Verwenden Sie EncryptedSharedPreferences zum Speichern von: OAuth-Refresh-Token, API-Schlüsseln für externe Dienste, E-Mail-Adresse oder Telefonnummer des Benutzers sowie vertraulichen App-Einstellungen (PIN, Authentifizierungsflags). EncryptedSharedPreferences ist nicht geeignet für biometrische Daten oder große Dokumente — verwenden Sie stattdessen EncryptedFile oder Room mit SQLCipher.

Die allgemeine Regel: Wenn ein Datenleck dem Benutzer oder Unternehmen schadet — verwenden Sie EncryptedSharedPreferences. Wenn die Daten nur kosmetischer Natur sind (Design, Sprache, Sortierung) — normale SharedPreferences. Es ist sinnvoll, EncryptedSharedPreferences von Anfang an zu implementieren, ohne Refactoring: Die Ersetzung in einem bestehenden Projekt erfordert Migration und die Verarbeitung alter unverschlüsselter Daten.

Denken Sie daran, dass EncryptedSharedPreferences Daten nur während der Ausführung der App schützt — nur auf der Festplatte. Wenn ein Angreifer Zugriff auf den Prozessspeicher hat, können entschlüsselte Daten abgefangen werden. Verwenden Sie zusätzlichen Schutz: ProGuard/DexGuard zur Verschleierung.

Häufig gestellte Fragen

Wie unterscheidet sich EncryptedSharedPreferences von DataStore?

Jetpack DataStore ist eine modernere Alternative zu SharedPreferences, die auf Flow und Kotlin-Koroutinen basiert. DataStore verschlüsselt Daten standardmäßig nicht, kann aber mit EncryptedSharedPreferences kombiniert oder mit manueller Verschlüsselung über Proto DataStore mit kryptografischen Protokollen verwendet werden.

Kann EncryptedSharedPreferences für große Datenmengen verwendet werden?

Nicht empfohlen. EncryptedSharedPreferences ist für kleine Volumina (bis zu 100-200 KB) ausgelegt. Für größere Daten verwenden Sie Room mit SQLCipher oder Dateiverschlüsselung über EncryptedFile aus derselben AndroidX Security-Bibliothek.

Unterstützt EncryptedSharedPreferences die Migration bei Schemaänderungen?

Nein, es gibt keine automatische Schema-Migration. Bei Änderung der Datenstruktur muss der Entwickler manuell alte Daten über den alten KeyGen lesen und über den neuen schreiben. Es wird empfohlen, die Schema-Version in einem separaten Parameter zu speichern.

Welches Mindest-API-Level ist erforderlich?

AndroidX Security 1.0.0 unterstützt API 19+ (Android KitKat). Version 1.1.0-alpha06 unterstützt ebenfalls API 19+. StrongBox erfordert API 28+ und ein Gerät mit Hardwareunterstützung (Google Pixel 3+, Samsung Galaxy S9+).

Ist es sicher, ein Refresh-Token in EncryptedSharedPreferences zu speichern?

Ja, Refresh-Token ist einer der Hauptanwendungsfälle. AES-256 GCM-Verschlüsselung, Masterschlüssel im Keystore, biometrischer Schutz — ein ausreichendes Niveau für OAuth-Token. Für kurzlebige Zugriffstoken ist es ebenfalls geeignet, obwohl einige Teams es vorziehen, sie im Speicher zu halten.

Zusammenfassung

  • EncryptedSharedPreferences — ein SharedPreferences-Wrapper mit automatischer Verschlüsselung über AES-256 GCM (Werte) und SIV (Schlüssel)
  • Master Key wird über MasterKey.Builder erstellt und in Android Keystore mit biometrischen und StrongBox-Optionen gespeichert
  • API ist vollständig kompatibel: edit, putString, getString, apply, clear — alles wie bei normalen SharedPreferences
  • Leistung: 2-15 ms pro Operation, für den Benutzer in Standardszenarien nicht spürbar
  • Sicherheit: Authentifizierte Verschlüsselung (AEAD) verhindert sowohl das Lesen als auch die Manipulation von Daten
  • Migration von normalen SharedPreferences erfordert manuelle Datenübertragung über alte und neue Dateien
  • Verwenden Sie EncryptedSharedPreferences für Token, API-Schlüssel, Passwörter und andere vertrauliche Einstellungen

Wir entwickeln eine mobile Applikation schlüsselfertig

IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.

Projekt besprechen

Lesen Sie auch