84 votes

Sauvegarder les données sensibles dans React Native

Je construis une application React Native et j'ai besoin de sauvegarder certaines données sensibles comme un jeton et un jeton de rafraîchissement. La solution évidente est de sauvegarder ces informations en utilisant AsyncStorage . Le problème est le niveau de sécurité de l'AsyncStorage.

AsyncStorage fournit un moyen de stocker localement des jetons et des données. Il peut être, à certains égards, comparé à une option LocalStorage. Dans les applications de production, il est recommandé de ne pas accéder directement à AsyncStorage directement, mais plutôt d'utiliser une couche d'abstraction, étant donné que AsyncStorage est partagé avec d'autres applications utilisant le même navigateur, et donc une une suppression malencontreuse de tous les éléments du stockage pourrait compromettre le le fonctionnement des applications voisines.

https://auth0.com/blog/adding-authentication-to-react-native-using-jwt/

Dans une application native, j'opterais pour Keychain sur iOS y Shared Preferences sur mode privé sur Android .

Pour ce que j'ai lu dans la documentation fournie par React Native :

Sur iOS, AsyncStorage est soutenu par du code natif qui stocke les petites valeurs dans un dictionnaire sérialisé et les valeurs plus importantes dans des fichiers séparés. dans un dictionnaire sérialisé et les valeurs plus importantes dans des fichiers séparés. Sur Android, AsyncStorage utilise RocksDB ou SQLite en fonction de ce qui est disponible. est disponible.

https://facebook.github.io/react-native/docs/asyncstorage.html

Ils ne parlent jamais de la sécurité de ces données.

C'est la meilleure solution pour créer un module pour Android (qui utilise Shared Preferences sur mode privé ) et un autre pour iOS (qui utilise Porte-clés ) pour sauvegarder les données sensibles ? Ou bien est-il possible d'utiliser la méthode AsyncStorage méthodes fournies ?

1 votes

Ce que vous cherchez, est répondu dans ce post : stackoverflow.com/questions/37563224/

1 votes

Cette réponse ne fait pas de supposition quant à la sécurité de l'entreprise. AsyncStorage .

0 votes

Vous pouvez jeter un coup d'œil à cet article : stackoverflow.com/questions/45547657/

136voto

Sandro Machado Points 5357

En creusant dans le code de React Native, j'ai trouvé la réponse.

Android

El React Native AsyncStorage La mise en œuvre du module est basée sur SQLiteOpenHelper . Le paquet où toutes les classes de données sont traitées : https://github.com/facebook/react-native/tree/master/ReactAndroid/src/main/java/com/facebook/react/modules/storage

La classe avec les instructions pour créer la base de données : https://github.com/facebook/react-native/blob/master/ReactAndroid/src/main/java/com/facebook/react/modules/storage/ReactDatabaseSupplier.java

Selon la documentation d'Android, les bases de données créées par l'application sont sauvegardées dans l'espace disque privé associé à l'application, ce qui la rend sûre.

Tout comme les fichiers que vous enregistrez sur le stockage interne de l'appareil, Android stocke votre base de données dans l'espace disque privé associé à l'application à l'application. Vos données sont sécurisées, car par défaut cet espace n'est pas accessible aux autres applications.

Fuente

iOS

Dans iOS, le AsyncStorage sont enregistrées dans des fichiers dictionnaires sérialisés. Ces fichiers sont enregistrés dans l'application NSDocumentDirectory . Dans iOS, toutes les applications vivent dans leur propre bac à sable Ainsi, tous les fichiers d'une application sont sécurisés et ne sont pas accessibles aux autres applications.

Le code dans iOS qui gère le AsyncStorage peut être trouvé ici : https://github.com/facebook/react-native/blob/master/React/Modules/RCTAsyncLocalStorage.m

Et comme nous pouvons le voir aquí les fichiers utilisés pour stocker les valeurs sauvegardées par les AsyncStorage sont enregistrées sous le NSDocumentDirectory (dans l'environnement de l'application sandbox).

Chaque application est une île Les interactions d'une application iOS avec le système de fichiers sont limitées principalement aux répertoires à l'intérieur de la sandbox de l'application. Pendant l'installation d'une nouvelle application sur l'installation d'une nouvelle application, le programme d'installation crée un certain nombre de conteneurs pour l'application. conteneurs pour l'application. Chaque conteneur a un rôle spécifique. Le conteneur bundle contient le bundle de l'application, tandis que le conteneur de données contient des les données de l'application et de l'utilisateur. Le conteneur de données est divisé en un certain nombre de répertoires que l'application peut utiliser pour trier et organiser ses données. L'application peut également demander l'accès à conteneurs supplémentaires, par exemple le conteneur iCloud, au moment de l'exécution.

Fuente

Conclusion

Il est sûr à utiliser AsyncStorage pour enregistrer les jetons d'utilisateur, puisqu'ils sont enregistrés dans un contexte sécurisé.

Veuillez noter que cela n'est vrai que pour les appareils Android sans Racine et pour les appareils iOS sans jailbreak . Veuillez également noter que si l'attaquant a accès physique à l'appareil et l'appareil n'est pas protégé. Il peut connecter l'appareil à l'ordinateur portable Mac et extraire les documents et voir tous les contenus enregistrés dans le répertoire des documents.

9 votes

Excellente réponse étayée par des références et des faits. Merci !

1 votes

Re : Android : "donc c'est sécurisé" : rien n'est sécurisé, une proximité de l'idéal de "sécurisé" peut être atteinte. Dans ce cas, les données sont accessibles si l'appareil est rooté (intentionnellement ou non).

27 votes

Comme je l'ai dit dans la conclusion.

10voto

Eric Points 1892

AsyncStorage enregistre les paires clé-valeur dans un fichier JSON en texte clair dans le répertoire Documents. Il ne crypte pas son contenu .

Il s'agit d'un problème de sécurité (au moins sur iOS) car il est possible pour un attaquant ayant accès à l'appareil d'obtenir un vidage du contenu du bac à sable et d'extraire trivialement toutes les données sauvegardées par l'intermédiaire de la fonction AsyncStorage .

Auparavant, cela n'était pas clairement indiqué dans les documents relatifs à AsyncStorage.js, mais c'est désormais le cas : https://github.com/facebook/react-native/pull/8809

Voir aussi : https://stackoverflow.com/a/38398114/1072846

1 votes

Tout ceci est vrai. Vous ne devez pas stocker de données sensibles avec AsyncStorage, que ce soit sur iOS ou Android.

0 votes

Alors est-ce que c'est sûr si on utilise react-native-keychain pour crypter le jeton et le stocker dans le fichier AsyncStorage ?

5voto

flaky Points 306

Si quelqu'un souhaite l'étape supplémentaire du cryptage des données, vous pouvez envisager cette solution : https://github.com/oblador/react-native-keychain

Il utilise dissimuler sur facebook en interne.

4voto

Julien Kode Points 1656

Je vous recommande vraiment d'utiliser une bibliothèque comme react-native-keychain pour stocker des données privées dans react-native

Pour le niveau d'API Android :

  • 16-22 utiliser Facebook Conceal
  • 23+ utilisent Android Keystore

Vous pouvez l'utiliser comme ça :

// Generic Password, service argument optional
Keychain
  .setGenericPassword(username, password)
  .then(function() {
    console.log('Credentials saved successfully!');
  });

// service argument optional
Keychain
  .getGenericPassword()
  .then(function(credentials) {
    console.log('Credentials successfully loaded for user ' + credentials.username);
  }).catch(function(error) {
    console.log('Keychain couldn\'t be accessed! Maybe no value set?', error);
  });

2 votes

Existe-t-il un moyen de stocker un deuxième ensemble d'informations d'identification dans le trousseau de clés ? Je n'ai trouvé qu'un seul moyen de définir une paire de valeurs, et j'ai déjà utilisé ce créneau pour stocker le nom d'utilisateur et le mot de passe de l'utilisateur qui seront utilisés en conjonction avec l'authentification biométrique (touchId/faceId).

2 votes

Cette librairie pourrait-elle être utilisée pour stocker un jeton jwt ? Je ne suis pas trop intéressé par le stockage d'un nom d'utilisateur ou d'un mot de passe, je cherche un moyen sûr de stocker un jeton entre mon application principale (react native) et une extension de partage iOS qui est sous le même bundle et groupe d'applications. Si la réponse est oui, quelle fonction API doit être utilisée pour définir le jeton dans le trousseau ? Merci

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X