EncryptedSharedPreferences: Nedir, API ve Nasıl Kullanılır

Yazar: IT Sectr Yayınlanma: 2026-03-14 Okuma süresi: 10 dk

EncryptedSharedPreferences, SharedPreferences API aracılığıyla kaydedilen verilerin şeffaf şekilde şifrelenmesini sağlayan AndroidX Security kütüphanesinin bir bileşenidir. Verilerin düz bir XML dosyasında saklandığı normal SharedPreferences'ın aksine, EncryptedSharedPreferences diske yazmadan önce anahtarları ve değerleri otomatik olarak şifreler. Android Developers'a göre kütüphane, değerler için AES-256 GCM ve anahtarlar için AES-256 SIV (RFC 5297) kullanarak verilerin gizliliğini ve bütünlüğünü sağlar.

Önemli Noktalar

  • EncryptedSharedPreferences — tüm kaydedilen verilerin otomatik şifrelenmesiyle SharedPreferences üzerinde bir sarmalayıcı
  • Şifreleme, Android Keystore aracılığıyla değerler için AES-256 GCM ve anahtarlar için AES-256 SIV kullanır
  • Authenticated Encryption (AEAD), yazma işleminden sonra verilerin değiştirilmediğini garanti eder
  • Master Key, Android Keystore'da saklanır ve TEE'ye sahip cihazlarda donanım korumalıdır
  • API tamamen SharedPreferences ile uyumludur — değiştirme, okuma ve yazma kodunu değiştirmeden gerçekleşir

EncryptedSharedPreferences Nedir?

EncryptedSharedPreferences, androidx.security.crypto paketinden bir sınıftır ve AndroidX Security 1.0.0 (2019) ile tanıtılmıştır. SharedPreferences arayüzünü uygular, ancak tüm yazma işlemleri (putString, putInt, putBoolean, vb.) verileri önceden şifreler ve okuma işlemleri verileri döndürmeden önce şifresini çözer.

Normal SharedPreferences'ın Sorunu

Standart SharedPreferences, uygulama dizinindeki (/data/data/package/shared_prefs/) bir XML dosyasına veri kaydeder. Dosya şifrelenmemiştir — cihaza root erişimi veya yedekleme analizi sırasında tüm veriler düz XML olarak okunabilir. Kimlik doğrulama token'ları, API anahtarları ve kullanıcının kişisel verileri saldırganın erişimine açık hale gelir.

EncryptedSharedPreferences bu sorunu kütüphane düzeyinde çözer: veriler diske yazılmadan önce şifrelenir ve okunduğunda şifresi çözülür. Geliştiricinin manuel olarak kriptografik işlevleri çağırması gerekmez — API normal SharedPreferences ile aynı kalır.

Tarihçe ve Sürümler

AndroidX Security kütüphanesi v1.0.0 Aralık 2019'da yayınlandı. EncryptedSharedPreferences, Cipher + SharedPreferences aracılığıyla manuel şifrelemenin eski yaklaşımının yerini aldı. Mevcut kararlı sürüm 1.1.0-alpha06'dır (2024) ve API 19+'yı destekler. Kütüphane Jetpack'in bir parçasıdır ve ek izin gerektirmez.

Google Security Blog (2024)'e göre EncryptedSharedPreferences, bulut senkronizasyonu gerektirmeyen hassas uygulama ayarlarını saklamak için önerilen yöntemdir. Daha karmaşık senaryolar için SQLCipher şifrelemesiyle Room önerilir.

EncryptedSharedPreferences Nasıl Çalışır?

EncryptedSharedPreferences iki seviyeli bir şifreleme şeması kullanır: Master Key, Android Keystore'da saklanır ve veri şifrelemesi için türetilmiş anahtarlar kullanılır. Bu, Keystore korumasını simetrik şifrelemenin performansıyla birleştirir.

Şifreleme Şeması: AES-256 GCM + SIV

Değerler için AES-256 GCM (Galois/Counter Mode) kullanılır — veri gizliliğini ve bütünlüğünü sağlayan kimlik doğrulamalı şifreleme modu (AEAD). Anahtarlar (parametre adları) için AES-256 SIV (RFC 5297) uygulanır — içeriğini açığa çıkarmadan anahtar araması için gerekli olan deterministik şifreleme.

EncryptedSharedPreferences'ın her dosyası şifrelenmiş anahtar-değer çiftleri içerir. Dosya yapısı şunları içerir: önce meta verilerle (sürüm, anahtar tanımlayıcı) bir başlık, ardından şifrelenmiş girdilerin bir listesi. Dosya geçerli bir XML değildir ve metin düzenleyicilerle okunamaz.

MasterKey ve KeyStore

MasterKey sınıfı, Android Keystore'da saklanan 256 bitlik bir ana anahtarın oluşturulması ve yönetilmesinden sorumludur. MasterKey.Builder şunları yapılandırmaya olanak tanır: depolama türü (Keystore veya yazılım), biyometrik koruma ve anahtar ömrü. Varsayılan olarak ana anahtar, Android Keystore'da AES/GCM/NoPadding algoritmasıyla oluşturulur.

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
    )
}

Şifreleme Kurulumu ve Yapılandırması

EncryptedSharedPreferences.create beş parametre alır: bağlam, dosya adı, ana anahtar, anahtar şifreleme şeması ve değer şifreleme şeması. Şemaların seçimi performansı ve güvenlik seviyesini etkiler.

Anahtar Şifreleme Şemaları

AES256_SIV — deterministik şifreleme: aynı anahtarlar her zaman aynı şifreli metni üretir. Bu, anahtar araması (SharedPreferences.getX(key)) için gereklidir. Dezavantajı: bir saldırgan, tekrarlanan şifreli metinleri karşılaştırarak hangi anahtarların kullanıldığını belirleyebilir. AES256_SIV2 — ek rastgeleleştirme ile geliştirilmiş bir sürüm.

Değerler için AES256_GCM kullanılır. GCM, her değere 12 baytlık bir IV (başlatma vektörü) ve 16 baytlık bir kimlik doğrulama etiketi ekler. Bu, gizlilik (hiç kimse değeri okuyamaz) ve kimlik doğrulama (hiç kimse fark edilmeden değeri değiştiremez) sağlar.

Ana Anahtarın Biyometrik Koruması

MasterKey.Builder'daki setUserAuthenticationRequired(true) yöntemi, ana anahtarı Keystore'dan almadan önce biyometrik onay gerektirir. Bu ek bir katman ekler: uygulama kilitlenmemiş bir cihazda çalışıyor olsa bile, bir saldırgan Face ID veya Touch ID olmadan EncryptedSharedPreferences'ı okuyamaz.

Önemli: setUserAuthenticationRequired ile kullanıcı biyometrik verilerini değiştirir veya silerse ana anahtar kullanılamaz hale gelir. KeyPermanentlyInvalidatedException'ı işlemek ve veri geçişiyle yeni bir ana anahtar oluşturmak gerekir.

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) {
        // Biyometri değişti — anahtarın yeniden oluşturulması gerekiyor
    }
}

Kotlin'de Kullanım Örneği

Kotlin kullanarak bir Android uygulamasında EncryptedSharedPreferences'ı entegre etmenin tam bir örneğine bakalım. androidx.security:security-crypto kütüphanesi Gradle aracılığıyla eklenir.

Bağımlılık Ekleme

build.gradle (app) dosyasına ekleyin: implementation “androidx.security:security-crypto:1.1.0-alpha06”. Kotlin projeleri için kotlin-stdlib de gereklidir. MasterKey başlatması bir kez yapılır, genellikle Application.onCreate'da veya bir DI kapsayıcısı aracılığıyla.

Veri Okuma ve Yazma

EncryptedSharedPreferences örneği oluşturulduktan sonra API, normal SharedPreferences'dan farklı değildir. edit() bir Editor döndürür, tüm yöntemler (putString, getString, putBoolean, getBoolean) aynı şekilde çalışır. Tek fark içseldir: veriler yazarken şifrelenir ve okurken şifresi çözülür.

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()
    }
}

Normal SharedPreferences'dan Geçiş

Şifrelenmemiş SharedPreferences'dan EncryptedSharedPreferences'a mevcut verileri geçirmek için: eski dosyadaki tüm verileri okuyun, yeni bir EncryptedSharedPreferences oluşturun, tüm verileri yazın ve eski dosyayı silin. Google yerleşik bir geçiş aracı sağlamaz — geliştirici manuel olarak uygular.

Normal SharedPreferences ile Karşılaştırma

SharedPreferences ve EncryptedSharedPreferences arasındaki seçim, depolanan verinin türüne bağlıdır. Arayüz ayarları (tema, dil, sıralama) için normal SharedPreferences yeterlidir. Gizli bilgiler (token'lar, şifreler, anahtarlar) için EncryptedSharedPreferences zorunludur.

Performans

EncryptedSharedPreferences, kriptografik işlemler nedeniyle normalden daha yavaştır. Tek bir dize değeri yazmak ~5-15 ms sürer (veri boyutuna ve AES donanım hızlandırmasına bağlı olarak). Okuma 2-5 ms sürer. Çoğu uygulama için bu fark edilmez, ancak toplu işlemler (geçiş, geri yükleme) için commit() yerine apply() kullanın.

Güvenlik

Normal SharedPreferences hiçbir kriptografik koruma sağlamaz: XML dosyası, root erişimi olan herhangi bir işlem veya adb backup aracılığıyla okunabilir. EncryptedSharedPreferences verileri uygulama düzeyinde şifreler ve ana anahtar, isteğe bağlı donanım koruması (StrongBox) ile Android Keystore'da saklanır.

ÖzellikSharedPreferencesEncryptedSharedPreferences
DepolamaDüz XMLŞifrelenmiş ikili dosya
ŞifrelemeYokAES-256 GCM + SIV
Anahtar KorumasıYokAndroid Keystore + StrongBox
Performans0.1-1 ms2-15 ms
ÖneriArayüz AyarlarıToken'lar, anahtarlar, PII

EncryptedSharedPreferences Ne Zaman Seçilmeli

EncryptedSharedPreferences şunları depolamak için kullanın: OAuth yenileme token'ları, harici hizmetler için API anahtarları, kullanıcının e-posta adresi veya telefon numarası ve hassas uygulama ayarları (PIN, kimlik doğrulama bayrakları). EncryptedSharedPreferences, biyometrik verileri veya büyük belgeleri depolamak için uygun değildir — bunun yerine EncryptedFile veya SQLCipher ile Room kullanın.

Genel kural: veri sızıntısı kullanıcıya veya işletmeye zarar verecekse — EncryptedSharedPreferences kullanın. Veriler yalnızca kozmetikse (tema, dil, sıralama) — normal SharedPreferences. EncryptedSharedPreferences'ı baştan uygulamak mantıklıdır, yeniden düzenleme gerektirmez: mevcut bir projede değiştirilmesi, geçiş ve eski şifrelenmemiş verilerin işlenmesini gerektirir.

EncryptedSharedPreferences'ın verileri uygulama çalışırken değil, yalnızca diskte koruduğunu unutmayın. Bir saldırganın işlem belleğine erişimi varsa, şifresi çözülmüş veriler ele geçirilebilir. Ek koruma kullanın: karartma için ProGuard/DexGuard.

Sıkça Sorulan Sorular

EncryptedSharedPreferences, DataStore'dan nasıl farklıdır?

Jetpack DataStore, Flow ve Kotlin eşyordamlarına dayanan, SharedPreferences'ın daha modern bir alternatifidir. DataStore varsayılan olarak verileri şifrelemez, ancak EncryptedSharedPreferences ile birleştirilebilir veya kriptografik protokollerle Proto DataStore aracılığıyla manuel şifrelemeyle kullanılabilir.

EncryptedSharedPreferences büyük veri hacimleri için kullanılabilir mi?

Önerilmez. EncryptedSharedPreferences küçük hacimler (100-200 KB'a kadar) için tasarlanmıştır. Daha büyük veriler için, aynı AndroidX Security kütüphanesinden SQLCipher ile Room veya EncryptedFile aracılığıyla dosya şifrelemesi kullanın.

EncryptedSharedPreferences şema güncellemesinde geçişi destekliyor mu?

Hayır, otomatik şema geçişi yoktur. Veri yapısı değiştirilirken geliştirici, eski KeyGen aracılığıyla eski verileri manuel olarak okumalı ve yenisi aracılığıyla yazmalıdır. Şema sürümünün ayrı bir parametrede saklanması önerilir.

Gereken minimum API seviyesi nedir?

AndroidX Security 1.0.0, API 19+'yı (Android KitKat) destekler. Sürüm 1.1.0-alpha06 da API 19+'yı destekler. StrongBox, API 28+ ve donanım desteği olan bir cihaz gerektirir (Google Pixel 3+, Samsung Galaxy S9+).

EncryptedSharedPreferences'da refresh token saklamak güvenli midir?

Evet, refresh token ana kullanım senaryolarından biridir. AES-256 GCM şifrelemesi, Keystore'da ana anahtar, biyometrik koruma — OAuth token'ları için yeterli bir seviye. Kısa ömürlü erişim token'ları için de uygundur, ancak bazı ekipler bunları bellekte saklamayı tercih eder.

Özet

  • EncryptedSharedPreferences — AES-256 GCM (değerler) ve SIV (anahtarlar) ile otomatik şifrelemeli SharedPreferences sarmalayıcısı
  • Master Key MasterKey.Builder aracılığıyla oluşturulur ve biyometrik ve StrongBox seçenekleriyle Android Keystore'da saklanır
  • API tamamen uyumlu: edit, putString, getString, apply, clear — hepsi normal SharedPreferences'taki gibi
  • Performans: işlem başına 2-15 ms, standart senaryolarda kullanıcı tarafından fark edilmez
  • Güvenlik: kimlik doğrulamalı şifreleme (AEAD) verilerin hem okunmasını hem de değiştirilmesini önler
  • Geçiş normal SharedPreferences'dan eski ve yeni dosyalar aracılığıyla manuel veri aktarımı gerektirir
  • Token'lar, API anahtarları, şifreler ve diğer hassas ayarlar için EncryptedSharedPreferences kullanın

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun