ScaleRocket/Mobile

Stockage sécurisé

Utilisation d'expo-secure-store pour les tokens, pourquoi AsyncStorage est dangereux pour les données sensibles, et mécanismes de stockage par plateforme.

Stockage sécurisé

Les données sensibles comme les tokens d'authentification doivent être stockées dans un stockage chiffré et supporté par le matériel. ScaleRocket Mobile utilise expo-secure-store qui exploite le Keychain iOS et le Keystore Android.

Pourquoi pas AsyncStorage ?

AsyncStorage stocke les données en texte clair dans une base SQLite sur le système de fichiers :

FonctionnalitéAsyncStorageSecureStore
ChiffrementAucunMatériel
Stockage iOSFichier SQLiteKeychain
Stockage AndroidFichier SQLiteKeystore + SharedPreferences
Accessible après jailbreakOuiBeaucoup plus difficile
Limite de taillePas de limite pratique2Ko par valeur
Cas d'usagePréférences, cacheTokens, secrets

Règle : Si la donnée pourrait être utilisée pour usurper l'identité de l'utilisateur ou accéder à son compte, utilisez SecureStore.

Installation

expo-secure-store est pré-installé dans ScaleRocket Mobile. Pour les nouveaux projets :

npx expo install expo-secure-store

Note : SecureStore nécessite un build de développement. Il ne fonctionne pas dans Expo Go.

Utilisation de base

import * as SecureStore from "expo-secure-store";

// Stocker une valeur
await SecureStore.setItemAsync("auth-token", "eyJhbGciOiJIUzI1NiIs...");

// Récupérer une valeur
const token = await SecureStore.getItemAsync("auth-token");

// Supprimer une valeur
await SecureStore.deleteItemAsync("auth-token");

Comportement par plateforme

iOS — Keychain

Sur iOS, SecureStore utilise l'API Keychain Services :

  • Les données sont chiffrées avec le Secure Enclave de l'appareil
  • Protégées par le code d'accès/biométrie de l'utilisateur
  • Survivent à la réinstallation de l'app (sauf suppression explicite)
  • Peuvent être sauvegardées dans le Keychain iCloud

Configurez le niveau d'accessibilité :

await SecureStore.setItemAsync("auth-token", token, {
  keychainAccessible: SecureStore.WHEN_UNLOCKED,
});
NiveauQuand accessible
WHEN_UNLOCKEDSeulement quand l'appareil est déverrouillé (défaut)
AFTER_FIRST_UNLOCKAprès le premier déverrouillage jusqu'au redémarrage
ALWAYSToujours (le moins sécurisé)

Android — Keystore

Sur Android, SecureStore utilise :

  • Le système Android Keystore pour la gestion des clés
  • Le chiffrement AES pour les valeurs stockées
  • Les clés sont liées au matériel de l'appareil
  • Les données ne survivent pas à la désinstallation de l'app

Pattern de stockage des tokens d'auth

ScaleRocket Mobile utilise SecureStore comme adaptateur de stockage de session Supabase :

import * as SecureStore from "expo-secure-store";
import { createClient } from "@supabase/supabase-js";

const SecureStoreAdapter = {
  getItem: (key: string) => SecureStore.getItemAsync(key),
  setItem: (key: string, value: string) => SecureStore.setItemAsync(key, value),
  removeItem: (key: string) => SecureStore.deleteItemAsync(key),
};

export const supabase = createClient(supabaseUrl, supabaseAnonKey, {
  auth: {
    storage: SecureStoreAdapter,
    autoRefreshToken: true,
    persistSession: true,
    detectSessionInUrl: false,
  },
});

Effacer les données sensibles

Effacez toujours toutes les données sécurisées à la déconnexion :

async function signOut() {
  await SecureStore.deleteItemAsync("auth-token");
  await SecureStore.deleteItemAsync("refresh-token");
  await SecureStore.deleteItemAsync("user-id");
  // Puis naviguer vers l'écran de connexion
}

Limitations de taille

SecureStore a une limite de 2Ko par valeur. Pour des données plus grandes :

  • Divisez en plusieurs clés
  • Stockez une référence (ID) dans SecureStore et les données dans AsyncStorage (si non sensibles)
  • Compressez avant de stocker
// Si un JWT est trop grand (rare mais possible)
const parts = splitString(largeToken, 2000);
for (let i = 0; i < parts.length; i++) {
  await SecureStore.setItemAsync(`token-part-${i}`, parts[i]);
}

Tests

  • Simulateur iOS : SecureStore fonctionne normalement dans le simulateur
  • Émulateur Android : SecureStore fonctionne mais avec des clés logicielles
  • Expo Go : SecureStore n'est pas disponible — utilisez un build de développement

On this page