Sobes.tech
Middle

Gdzie będziesz przechowywać tokeny?

sobes.tech AI

Odpowiedź od AI

Aby przechowywać tokeny, zwłaszcza poufne (dostęp do API, sesje użytkowników), w aplikacji Android rozważę następujące miejsca:

  1. SharedPreferences (zaszyfrowane lub z użyciem EncryptedSharedPreferences) : Odpowiednie dla małych tokenów. EncryptedSharedPreferences (część Biblioteki Bezpieczeństwa) zapewnia sprzętowe szyfrowanie na obsługiwanych urządzeniach, zwiększając bezpieczeństwo w porównaniu do zwykłych SharedPreferences.

    // Tworzenie EncryptedSharedPreferences
    val context: Context = applicationContext
    val masterKeyAlias = MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC)
    
    val sharedPreferences = EncryptedSharedPreferences.create(
        "secure_preferences",
        masterKeyAlias,
        context,
        EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
        EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
    )
    
    // Zapisywanie tokenu
    with(sharedPreferences.edit()) {
        putString("auth_token", "twój poufny token")
        apply()
    }
    
    // Odczyt tokenu
    val authToken = sharedPreferences.getString("auth_token", null)
    
  2. System Android Keystore: Najbezpieczniejszy sposób przechowywania kluczy kryptograficznych i danych poufnych. Klucze są przechowywane w chronionej części urządzenia i nie mogą być wyciągnięte z aplikacji. System Keystore można używać do szyfrowania/deszyfrowania tokenów przechowywanych w SharedPreferences lub bazie danych.

    // Przykład pobrania klucza z Keystore (dla API poziomu 23+)
    val keyStore = KeyStore.getInstance("AndroidKeyStore")
    keyStore.load(null)
    val secretKeyEntry = keyStore.getEntry("my_encryption_key_alias", null) as KeyStore.SecretKeyEntry
    val secretKey = secretKeyEntry.secretKey
    // Użycie secretKey do szyfrowania/deszyfrowania tokenu
    
  3. Baza danych SQLite (zaszyfrowane tabele lub kolumny): Jeśli jest dużo tokenów lub są powiązane z innymi danymi, można użyć lokalnej bazy danych. Dla zwiększenia bezpieczeństwa dane tokenów powinny być przechowywane w zaszyfrowanych kolumnach lub używać biblioteki zapewniającej szyfrowanie całej bazy danych (np. SQLCipher dla Android).

    -- Przykład tworzenia tabeli z zaszyfrowaną kolumną (zależy od biblioteki)
    CREATE TABLE users (
        id INTEGER PRIMARY KEY,
        username TEXT,
        auth_token BLOB -- Przechowywanie zaszyfrowanego tokenu
    );
    
  4. Pamięć aplikacji (RAM): Tylko do tymczasowego przechowywania tokenu podczas krótkiego okresu jego używania w bieżącej sesji. Po zakończeniu sesji lub zamknięciu aplikacji token jest wyciągany i przechowywany w bardziej bezpieczny sposób. Nie nadaje się do trwałego przechowywania.

Wybór zależy od:

  • Poufności tokenu: Jak bardzo poufny jest token?
  • Rozmiaru tokenu: Małe tokeny są łatwiejsze do przechowywania w SharedPreferences lub Keystore.
  • Czasu życia tokenu: Czy token jest potrzebny po zamknięciu aplikacji?
  • Wersji Androida: Obsługa Keystore i EncryptedSharedPreferences się różni.

Zalecenie: Połączenie Keystore do przechowywania klucza szyfrowania z zaszyfrowanymi SharedPreferences lub zaszyfrowaną bazą danych do przechowywania samego tokenu. Zapewnia to wysoki poziom bezpieczeństwa przy stosunkowo prostym użytkowaniu.