Подтвердить что ты не робот

Сохранение конфиденциальных данных в 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?

4b9b3361

Ответ 1

Просто покопавшись в коде React Native, я нашел ответ.

Android

AsyncStorage модуля 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 без рута и для устройств iOS без джейлбрейка. Также обратите внимание, что если злоумышленник имеет физический доступ к устройству и устройство не защищено. Он может подключить устройство к ноутбуку Mac и извлечь каталог документов и просмотреть все содержимое, сохраненное в каталоге документов.

Ответ 2

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

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

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

Смотрите также: fooobar.com/questions/229884/...

Ответ 4

Я действительно рекомендую вам использовать библиотеку, например react-native-keychain для хранения личных данных в react-native

Для уровня API Android:

  • 16-22 использовать Facebook Скрытие
  • 23+ используйте Android Keystore

Вы можете использовать его так:

// 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);
  });