我正在构建一个 React Native 应用程序,我需要保存一些敏感数据,例如令牌和刷新令牌。显而易见的解决方案是使用 AsyncStorage 保存该信息。问题在于 AsyncStorage 的安全级别。
AsyncStorage 提供了一种在本地存储令牌和数据的方法。在某些方面,它可以与 LocalStorage 选项进行比较。在完整的生产应用程序中,建议不要直接访问 AsyncStorage,而是使用抽象层,因为 AsyncStorage 与使用同一浏览器的其他应用程序共享,因此从存储中删除所有项目的错误设想可能会损害相邻应用程序的功能。
https://auth0.com/blog/adding-authentication-to-react-native-using-jwt/
在本机应用程序中,我会选择 Keychain
在 iOS
和 Shared Preferences
在 Android
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 许可协议
只是深入研究 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 文档,应用程序创建的数据库保存在与应用程序关联的私有磁盘空间中,因此是安全的。
资源
iOS
在 iOS 中,
AsyncStorage
值保存在序列化的字典文件中。这些文件保存在应用程序NSDocumentDirectory
中。在 iOS 中,所有应用程序都存在于 自己的沙箱 中,因此一个应用程序的所有文件都是安全的,其他应用程序无法访问它们。iOS中处理
AsyncStorage
模块的代码可以在这里找到: https ://github.com/facebook/react-native/blob/master/React/Modules/RCTAsyncLocalStorage.m正如我们 在此处 看到的,用于存储由
AsyncStorage
保存的值的文件保存在NSDocumentDirectory
下(在应用程序沙箱环境中)。资源
结论
使用
AsyncStorage
保存用户令牌是安全的,因为它们保存在安全上下文中。请注意,这仅适用于没有 root 的 Android 设备和没有 越狱 的 iOS 设备。另请注意,如果攻击者可以 物理访问 设备并且设备不受保护。他可以将设备连接到mac笔记本电脑并 提取文档 目录并查看文档目录下保存的所有内容。