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

AsyncStorage提供了一种在本地存储令牌和数据的方法.它可以 在某些方面,与LocalStorage选项相比.全部 生产应用程序,建议不要访问AsyncStorage 直接使用抽象层,而不是像AsyncStorage那样使用抽象层 与使用同一浏览器的其他应用程序共享,因此 未经深思熟虑地将所有物品从仓库中移走可能会损害 相邻应用程序的功能.

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

在原生应用程序中,我会在iOS中 Select Keychain,在Android中 Select Shared Preferences,在private mode中 Select Shared Preferences.

我在React Native提供的文档中读到:

在IOS上,AsyncStorage由存储小值的本机代码支持 在序列化的字典中,而在单独的文件中使用更大的值.在……上面 Android、AsyncStorage将基于什么使用RocksDB或SQLite 是有空的.

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

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

最好的解决方案是为Android(private mode中使用Shared Preferences)创建一个模块,并为iOS(使用Keychain)创建另一个模块来保存敏感数据?或者使用所提供的AsyncStorage种方法是安全的?

推荐答案

只要深入研究REACTION原生代码,我就找到了答案.

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将您的数据库存储在关联的私有磁盘空间中 申请.您的数据是安全的,因为默认情况下此区域不安全 其他应用程序可以访问.

Source

iOS

在iOS中,AsyncStorage个值保存在序列化的字典文件中.这些文件保存在应用程序NSDocumentDirectory中.在iOS中,所有应用程序都驻留在their own sandbox中,因此一个应用程序的所有文件都是安全的,其他应用程序无法访问它们.

IOS中处理AsyncStorage模块的代码可以在以下位置找到:https://github.com/facebook/react-native/blob/master/React/Modules/RCTAsyncLocalStorage.m

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

每个应用程序都是一个孤岛,是iOS应用程序与文件系统的交互

Source

Conclusion

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

请注意,这只适用于不带root的Android设备和不带jailbreak的iOS设备.还请注意,如果攻击者有physical access到该设备,并且该设备不受保护.他可以将设备连接到Mac Laptop和extract the documents目录,并查看保存在Documents目录下的所有内容.

Ios相关问答推荐

RN 0.63支持iOS ProMotion?

如何在SwiftUI ScrollView中zoom 中心项目?

如果条件不满足,S从@ViewBuilder返回什么?

无法在所有窗口上方显示图像

如何在本地iOS没有插件的情况下处理平台线程?

如何创建具有SPM依赖项的二进制XCFramework?

在TVOS中访问SWIFT中的objc++函数时发送给类的无法识别的 Select 符

ScrollViewReader Scrollto Not Working

如何在Swift中同时实现三个手势?

如何制作支持不同语言的iOS应用

在Xcode 15中为具有@Binding的视图创建SwiftUI #预览的方法

Swift Vision库识别文本后如何将其赋值给 struct 体实例属性以供显示?

iOS 16 堆栈视图中按钮的奇怪动画

JSONDecoder 在模拟器上运行良好时无法在真实设备上解码

SensorKit - 获取数据不调用结果委托函数

如何告诉 SwiftUI 视图绑定到嵌套的 ObservableObjects

本月使用 iOS 的天数?

SLComposeViewController 分享教程

使用 Chrome DevTools 调试 iOS 6+7 Mobile Safari

如何使用 AFNetworking 设置超时