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/
在本机应用程序,我会去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提供的方法是否安全?
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笔记本电脑并解压缩文档目录,并查看文档目录下保存的所有内容.
AsyncStorage将键值对另存为Documents目录中的纯文本JSON文件。它不加密其内容。
这是一个安全问题(至少在iOS上是这样),因为有权访问该设备的攻击者有可能获得沙箱内容的转储,并琐碎提取通过保存的所有数据AsyncStorage。
以前在AsyncStorage.js的文档中并未对此明确说明,但现在是:https : //github.com/facebook/react-native/pull/8809
另请参阅:https : //stackoverflow.com/a/38398114/1072846
如果有人想要对数据进行加密的额外步骤,您可能需要查看以下内容: https: //github.com/oblador/react-native-keychain
它在内部使用facebook 隐藏。
| 归档时间: |
|
| 查看次数: |
17889 次 |
| 最近记录: |