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.
- ¿Cómo obtener la vista raíz de la aplicación Android de React Native?
- Cómo crear algún tipo de pantalla Splash / pantalla de inicio, que desaparece después de la aplicación cargada? (Reaccione Nativo)
- JSApplicationIllegalArgumentException con React Native Android
- React Native Integración con la aplicación de Android existente flash back
- Pasar un objeto Java a C ++ a través de JNI y luego volver a Java, a través de void *
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?
- La llamada de Twilio no funciona en iOS y Android en react-native
- Cómo disminuir React-Native Android tamaño de la aplicación
- ProcessReleaseResources
- React Native: TouchableOpacity onPresiona problemas dentro de un ScrollView
- React-nativo de Android WebView manejar clic en Url antes de cargar
- Reaccionar Native Memory Leakage Animation Issue
- Reaccionar WebView nativo html <select> no abre opciones en tablets Android
- Reaccionar-nativo con Android Studio
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.
- Escucha los mensajes / notificaciones de Whatsapp entrantes
- La aplicación se bloquea al restaurar desde el fondo después de mucho tiempo