在React Native中保存敏感数据

San*_*ado 45 android ios react-native

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

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

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

在本机应用程序,我会去KeychainiOS,并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提供的方法是否安全?

San*_*ado 84

刚刚深入了解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中,所有应用程序都存在于自己的沙箱中,因此一个应用程序的所有文件都是安全的,其他应用程序无法访问它们.

AsyncStorage可以在此处找到处理该模块的iOS代码:https://github.com/facebook/react-native/blob/master/React/Modules/RCTAsyncLocalStorage.m

正如我们在这里看到的,用于存储由其AsyncStorage保存的值的文件保存在NSDocumentDirectory(在应用程序沙箱环境中)下.

每个应用程序都是一个岛屿iOS应用程序与文件系统的交互主要限于应用程序沙箱内的目录.在安装新应用程序期间,安装程序会为应用程序创建许多容器.每个容器都有特定的角色.bundle容器保存app的包,而数据容器包含应用程序和用户的数据.数据容器进一步划分为许多目录,应用程序可以使用这些目录对数据进行排序和组织.应用程序还可以在运行时请求访问其他容器(例如,iCloud容器).

资源

结论

AsyncStorage用于保存用户令牌是安全的,因为它们是在安全的上下文中保存的.

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

  • 就像我在结论中说的那样. (16认同)
  • 伟大的答案支持参考和事实.谢谢! (5认同)
  • RN 文档特别指出,您不应使用 AsyncStorage 进行令牌存储 - https://reactnative.dev/docs/security (4认同)
  • “使用 AsyncStorage 保存用户令牌是**安全的**,因为它们保存在安全的上下文中。” 作为额外的一层,对用户令牌进行加密不是**更安全**吗?似乎很多用户都拥有 root 权限的 Android 设备并且可以窥探文件,但并不是每个人都会努力解密某些内容。 (2认同)

Eri*_*ric 5

AsyncStorage将键值对另存为Documents目录中的纯文本JSON文件。它不加密其内容

这是一个安全问题(至少在iOS上是这样),因为有权访问该设备的攻击者有可能获得沙箱内容的转储,并琐碎提取通过保存的所有数据AsyncStorage

以前在AsyncStorage.js的文档中并未对此明确说明,但现在是:https : //github.com/facebook/react-native/pull/8809

另请参阅:https : //stackoverflow.com/a/38398114/1072846


fla*_*aky 5

如果有人想要对数据进行加密的额外步骤,您可能需要查看以下内容: https: //github.com/oblador/react-native-keychain

它在内部使用facebook 隐藏