2016-08-18 3 views
28

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

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

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

В родном приложении, я хотел бы пойти на Keychain в iOS и Shared Preferences в частного режима в Android.

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

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

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

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

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

+0

Что вы ищете, на это сообщение: http://stackoverflow.com/questions/37563224/why-the-react-native-docs-recommends-that-you-use-an-abstraction-on -top-of-async –

+0

В этом ответе не делается никаких предположений относительно безопасности 'AsyncStorage'. –

+0

Вы можете посмотреть это сообщение: https://stackoverflow.com/questions/45547657/what-is-the-best-way-to-store-private-data-in-react-native –

ответ

43

Просто выкопав коренной код, я нашел ответ.

Android

Реализация React NativeAsyncStorage Модуль основан на 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 хранит базы данных в частном пространстве на диске, который связан приложения.Ваши данные безопасны, потому что по умолчанию эта область не является , доступной для других приложений.

Source

IOS

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

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

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

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

Source

Заключение

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

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

+1

Отличный ответ с поддержкой ссылки и факты. Спасибо! –

+1

Re: Android: «так безопасно»: ничего не безопасно, может быть достигнута близость к идеалу «безопасного». В этом случае доступ к данным возможен, если устройство коренится (намеренно или нет). – straya

+4

Как я сказал в заключении. –

2

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

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

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

Также смотрите: https://stackoverflow.com/a/38398114/1072846

1

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

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

  • 16-22 использование Facebook скрывающие
  • 23+ использование Android хранилища ключей

Вы можете использовать его следующим образом:

// 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); 
    }); 
Смежные вопросы