在“反应本机”中保存敏感数据

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

AsyncStorage 提供了一种本地存储令牌和数据的方法 在某些方面,可以与 LocalStorage 选项相比较 生产应用程序时,建议不要访问 AsyncStorage 而是直接使用一个抽象层,就像异步存储一样 与使用同一浏览器的其他应用程序共享,因此 考虑不周地将所有物品从储存中移走,可能会损害 邻近应用程序的功能。

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

在本地应用程序中,我会选择 iOS中的 KeychainAndroid中的 私人模式中的 Shared Preferences

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

在 iOS 上,AsyncStorage 由存储小值的本机代码支持 在一个序列化的字典和较大的值在单独的文件 基于什么,AsyncStorage 将使用 RocksDB 或 SQLite 是可用的。

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

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

最好的解决方案是为 Android(在 私人模式中使用 Shared Preferences)创建一个模块,为 iOS(使用 钥匙链)创建另一个模块来保存有意义的数据?或者使用提供的 AsyncStorage方法是安全的?

36338 次浏览

只要深入研究“反应原住民”的代码,我就找到了答案。

仿生人

React Native AsyncStorage模块实现是基于 SQLiteOpenHelper的。 处理所有数据类的软件包: < a href = “ https://github.com/facebook/response-national/tree/master/ReactAndroid/src/main/java/com/facebook/response/module/Storage”rel = “ norefrer”> 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保存用户令牌是安全的,因为它们是在安全上下文中保存的。

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

AsyncStorage将键值对作为明文 JSON 文件保存在 Document 目录中。

这是一个安全问题(至少在 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

它在内部使用 隐藏脸书

我真的建议您使用像 反应-本地-钥匙链这样的库在 本能反应中存储私有数据

对于 Android 应用程式介面级别:

  • 16-22使用 Facebook 隐藏
  • 23 + 使用 Android Keystore

你可以这样使用它:

// Generic Password, service argument optional
Keychain
.setGenericPassword(username, password)
.then(function() {
console.log('Credentials saved successfully!');
});


// service argument optional
Keychain
.getGenericPassword()
.then(function(credentials) {
console.log('Credentials successfully loaded for user ' + credentials.username);
}).catch(function(error) {
console.log('Keychain couldn\'t be accessed! Maybe no value set?', error);
});