在 React Native 中保存敏感数据

新手上路,请多包涵

我正在构建一个 React Native 应用程序,我需要保存一些敏感数据,例如令牌和刷新令牌。显而易见的解决方案是使用 AsyncStorage 保存该信息。问题在于 AsyncStorage 的安全级别。

AsyncStorage 提供了一种在本地存储令牌和数据的方法。在某些方面,它可以与 LocalStorage 选项进行比较。在完整的生产应用程序中,建议不要直接访问 AsyncStorage,而是使用抽象层,因为 AsyncStorage 与使用同一浏览器的其他应用程序共享,因此从存储中删除所有项目的错误设想可能会损害相邻应用程序的功能。

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

在本机应用程序中,我会选择 KeychainiOSShared PreferencesAndroid 8103bc7bf72c38a 中的 私有模式

对于我在 React Native 提供的文档中读到的内容:

在 iOS 上,AsyncStorage 由本机代码支持,该代码将小值存储在序列化字典中,将较大的值存储在单独的文件中。在 Android 上,AsyncStorage 将根据可用的内容使用 RocksDB 或 SQLite。

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

他们从不谈论这些数据的安全性。

最好的解决方案是为 Android (在 私有模式下 使用 Shared Preferences )和另一个 iOS (使用 钥匙串 来保存敏感数据)创建一个模块?或者使用提供的 AsyncStorage 方法是否安全?

原文由 Sandro Machado 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 700
1 个回答

只是深入研究 React Native 代码,我找到了答案。

安卓

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 保存用户令牌是安全的,因为它们保存在安全上下文中。

请注意,这仅适用于没有 root 的 Android 设备和没有 越狱 的 iOS 设备。另请注意,如果攻击者可以 物理访问 设备并且设备不受保护。他可以将设备连接到mac笔记本电脑并 提取文档 目录并查看文档目录下保存的所有内容。

原文由 Sandro Machado 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题