Сохранение конфиденциальных данных в React Native

Я создаю приложение React Native, и мне нужно сохранить некоторые конфиденциальные данные, такие как токен и токен обновления. Очевидным решением является сохранение этой информации с помощью AsyncStorage . Проблема заключается в уровне безопасности AsyncStorage.

AsyncStorage предоставляет способ локального хранения токенов и данных. Это может быть, в некотором роде, по сравнению с опцией LocalStorage. В приложениях с полным производством рекомендуется не обращаться к AsyncStorage напрямую, а вместо этого использовать слой абстракции, поскольку AsyncStorage используется совместно с другими приложениями с использованием одного и того же браузера, и, следовательно, неправильное удаление всех элементов из хранилища может нанести ущерб Функционирования соседних приложений.

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

В родном приложении я бы пошел на Keychain в iOS и Shared Preferences в приватном режиме на Android .

Для того, что я прочитал в документации, предоставленной React Native:

В iOS AsyncStorage поддерживается собственным кодом, который хранит небольшие значения в сериализованном словаре и больших значениях в отдельных файлах. На Android AsyncStorage будет использовать либо RocksDB, либо SQLite на основе того, что доступно.

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

Они никогда не говорят о безопасности этих данных.

Это лучшее решение для создания модуля для Android (который использует Shared Preferences в приватном режиме ), а другой для iOS (который использует Keychain ) для сохранения разумных данных? Или безопасно использовать методы AsyncStorage ?

Solutions Collecting From Web of "Сохранение конфиденциальных данных в React Native"

Я просто нашел правильный ответ.

Android

Реализация React Native AsyncStorage основана на SQLiteOpenHelper . Пакет, в котором обрабатываются все классы данных: https://github.com/facebook/react-native/tree/master/ReactAndroid/src/main/java/com/facebook/react/modules/storage

Класс с инструкциями по созданию базы данных: https://github.com/facebook/react-native/blob/master/ReactAndroid/src/main/java/com/facebook/react/modules/storage/ReactDatabaseSupplier.java

В документации по Android базы данных, созданные приложением, сохраняются на закрытом диске, связанном с ним, поэтому он безопасен.

Так же, как файлы, которые вы сохраняете на внутренней памяти устройства, Android хранит вашу базу данных на частном диске, связанном с приложением. Ваши данные безопасны, поскольку по умолчанию эта область недоступна для других приложений.

Источник

IOS

В iOS значения AsyncStorage сохраняются в сериализованных словарных файлах. Эти файлы сохраняются в приложении NSDocumentDirectory . В iOS все приложения живут в собственной песочнице , поэтому все файлы одного приложения защищены, к ним не могут обращаться другие приложения.

Код в iOS, который обрабатывает модуль AsyncStorage можно найти здесь: https://github.com/facebook/react-native/blob/master/React/Modules/RCTAsyncLocalStorage.m

И как мы видим здесь, файлы, используемые для хранения значений, сохраненных AsyncStorage , сохраняются в NSDocumentDirectory (внутри среды песочницы приложения).

Каждое приложение – это остров. Взаимодействие приложений iOS с файловой системой ограничено в основном каталогами в песочнице приложения. Во время установки нового приложения установщик создает несколько контейнеров для приложения. Каждый контейнер имеет определенную роль. Контейнер пакета содержит пакет приложения, тогда как контейнер данных хранит данные как для приложения, так и для пользователя. Контейнер данных далее делится на несколько каталогов, которые приложение может использовать для сортировки и организации своих данных. Приложение также может запрашивать доступ к дополнительным контейнерам, например, к контейнеру iCloud во время выполнения.

Источник

Вывод

Безопасное использование AsyncStorage для сохранения токенов пользователей, поскольку они сохраняются в безопасном контексте.

Обратите внимание, что это справедливо только для устройств Android без root и для iOS-устройств без джейлбрейка . Также обратите внимание, что если злоумышленник имеет физический доступ к устройству, и устройство не защищено. Он может подключить устройство к ноутбуку Mac и извлечь каталог документов и просмотреть все содержимое, сохраненное в каталоге документов.

AsyncStorage сохраняет пары ключ-значение как файл JSON открытого текста в каталоге Documents. Он не шифрует его содержимое .

Это проблема безопасности (по крайней мере, на iOS), потому что злоумышленник с доступом к устройству может получить дамп содержимого содержимого песочницы и тривиально извлечь любые данные, сохраненные через AsyncStorage .

Это не было четко указано в документах для AsyncStorage.js, но теперь это: https://github.com/facebook/react-native/pull/8809

См. Также: https://stackoverflow.com/a/38398114/1072846

Если кому-то нужен дополнительный шаг зашифрования данных, вы можете посмотреть на это: https://github.com/oblador/react-native-keychain

Он использует внутреннюю оболочку facebook .