Guardar datos confidenciales en React Native

Estoy construyendo una aplicación React Native y necesito guardar algunos datos sensibles como un token y un token de actualización. La solución obvia es guardar esa información usando AsyncStorage . El problema es el nivel de seguridad de AsyncStorage.

AsyncStorage proporciona una forma de almacenar localmente fichas y datos. Puede ser, en cierto modo, comparado con una opción de LocalStorage. En aplicaciones de producción completa, se recomienda no acceder directamente a AsyncStorage, sino utilizar una capa de abstracción, ya que AsyncStorage se comparte con otras aplicaciones que utilizan el mismo navegador y, por lo tanto, una eliminación mal concebida de todos los elementos del almacenamiento podría perjudicar Funcionamiento de aplicaciones vecinas.

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

En una aplicación nativa, iría por Keychain en iOS y Shared Preferences en modo privado en Android .

Por lo que he leído en la documentación proporcionada por React Native:

En iOS, AsyncStorage está respaldado por código nativo que almacena pequeños valores en un diccionario serializado y valores más grandes en archivos separados. En Android, AsyncStorage utilizará RocksDB o SQLite en función de lo que esté disponible.

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

Nunca hablan de la seguridad de esos datos.

Es la mejor solución crear un módulo para Android (que utiliza las Shared Preferences en modo privado ) y otro para iOS (que utiliza Llavero ) para guardar los datos sensibles? ¿O es seguro utilizar los métodos AsyncStorage proporcionados?

Acabo de cavar en el código React Native, encontré la respuesta.

Androide

La implementación del módulo React Native AsyncStorage se basa en SQLiteOpenHelper . El paquete donde se manejan todas las clases de datos: https://github.com/facebook/react-native/tree/master/ReactAndroid/src/main/java/com/facebook/react/modules/storage

La clase con las instrucciones para crear la base de datos: https://github.com/facebook/react-native/blob/master/ReactAndroid/src/main/java/com/facebook/react/modules/storage/ReactDatabaseSupplier.java

En la documentación de Android, las bases de datos creadas por la aplicación se guardan en el espacio de disco privado que es la aplicación asociada, por lo que es seguro.

Al igual que los archivos que guarda en el almacenamiento interno del dispositivo, Android almacena su base de datos en el espacio de disco privado que es la aplicación asociada. Sus datos son seguros porque, por defecto, esta área no es accesible para otras aplicaciones.

Fuente

IOS

En iOS, los valores de AsyncStorage se guardan en archivos de diccionario serializados. Esos archivos se guardan en la aplicación NSDocumentDirectory . En iOS todas las aplicaciones viven en su propia caja de arena , por lo que todos los archivos de una aplicación están protegidos, no pueden ser accedidos por las otras aplicaciones.

El código en iOS que maneja el módulo AsyncStorage se puede encontrar aquí: https://github.com/facebook/react-native/blob/master/React/Modules/RCTAsyncLocalStorage.m

Y como podemos ver aquí los archivos utilizados para almacenar los valores guardados por el AsyncStorage se guardan bajo NSDocumentDirectory (dentro del entorno de sandbox de la aplicación).

Cada aplicación es una isla Las interacciones de una aplicación iOS con el sistema de archivos se limitan principalmente a los directorios dentro de la zona de pruebas de la aplicación. Durante la instalación de una nueva aplicación, el instalador crea varios contenedores para la aplicación. Cada contenedor tiene un papel específico. El contenedor de bundle contiene el paquete de la aplicación, mientras que el contenedor de datos contiene datos tanto para la aplicación como para el usuario. El contenedor de datos se divide además en un número de directorios que la aplicación puede utilizar para ordenar y organizar sus datos. La aplicación también puede solicitar acceso a contenedores adicionales (por ejemplo, el contenedor iCloud) en tiempo de ejecución.

Fuente

Conclusión

Es seguro utilizar AsyncStorage para guardar fichas de usuario, ya que se guardan en un contexto seguro.

Tenga en cuenta que esto solo es válido para dispositivos Android sin root y para dispositivos iOS sin jailbreak . Tenga en cuenta también que si el atacante tiene acceso físico al dispositivo y el dispositivo no está protegido. Puede conectar el dispositivo al ordenador portátil del mac y extraer el directorio de los documentos y ver todo el contenido ahorrado debajo del directorio de los documentos.

AsyncStorage guarda pares clave-valor como un archivo JSON de texto sin formato en el directorio Documentos. No cifra su contenido .

Se trata de un problema de seguridad (al menos en iOS) porque es posible que un atacante con acceso al dispositivo obtenga un volcado de los contenidos de la caja de seguridad y extraiga trivialmente cualquier dato guardado a través de AsyncStorage .

Esto solía no estar claramente indicado en los documentos para AsyncStorage.js, pero ahora es: https://github.com/facebook/react-native/pull/8809

Consulte también: https://stackoverflow.com/a/38398114/1072846

Si alguien quiere el paso adicional de tener los datos encriptados, puede que quiera ver esto: https://github.com/oblador/react-native-keychain

Utiliza facebook ocultar internamente.

  • ¿Cómo reproduzco un sonido cuando la pantalla está bloqueada en Android en React Native?
  • React-native: La compilación falló con una excepción
  • Cree un módulo nativo nativo en C o C ++ usando Android NDK?
  • Reaccionar localizaciones nativas: Variable global
  • ReactNative - Cómo obtener la instancia de actividad a partir de la versión 0.29
  • Cambiar la ruta del archivo de entrada de android y ios en el proyecto reactivo-nativo
  • Jest error de caso de prueba en reactivo nativo mediante el complemento externo
  • React Native ListView TextInput se bloquea desde la renderización de optimización de rendimiento
  • Cambiar el nombre del paquete para Android en React Native
  • React-Native + Android, solo para arquitectura armeabi
  • Impedir que WebView cargue la URL en Android (React Native)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.