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é | AsyncStorage | SecureStore |
|---|---|---|
| Chiffrement | Aucun | Matériel |
| Stockage iOS | Fichier SQLite | Keychain |
| Stockage Android | Fichier SQLite | Keystore + SharedPreferences |
| Accessible après jailbreak | Oui | Beaucoup plus difficile |
| Limite de taille | Pas de limite pratique | 2Ko par valeur |
| Cas d'usage | Préférences, cache | Tokens, 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-storeNote : 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,
});| Niveau | Quand accessible |
|---|---|
WHEN_UNLOCKED | Seulement quand l'appareil est déverrouillé (défaut) |
AFTER_FIRST_UNLOCK | Après le premier déverrouillage jusqu'au redémarrage |
ALWAYS | Toujours (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