繁体   English   中英

在 React Native 中保存敏感数据

[英]Save sensitive data in React Native

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

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

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

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

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

在 iOS 上,AsyncStorage 由本机代码支持,该代码将小值存储在序列化字典中,并将较大值存储在单独的文件中。 在 Android 上,AsyncStorage 将根据可用内容使用 RocksDB 或 SQLite。

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

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

Android创建一个模块(在私有模式下使用Shared Preferences )和另一个为iOS (使用Keychain )创建一个模块来保存合理的数据是最好的解决方案吗? 或者使用提供的AsyncStorage方法是否安全?

只要深入研究 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文档,应用程序创建的数据库保存在关联应用程序的私有磁盘空间中,因此是安全的。

就像您保存在设备内部存储中的文件一样,Android 将您的数据库存储在与应用程序相关联的私有磁盘空间中。 您的数据是安全的,因为默认情况下其他应用程序无法访问此区域。

来源

IOS

在 iOS 中, AsyncStorage值保存在序列化的字典文件中。 这些文件保存在应用程序NSDocumentDirectory 在 iOS 中,所有应用程序都位于自己的沙箱中,因此一个应用程序的所有文件都是安全的,其他应用程序无法访问它们。

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

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

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

来源

结论

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

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

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

这是一个安全问题(至少在 iOS 上),因为有权访问设备的攻击者有可能获取沙箱内容的转储,并AsyncStorage提取通过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隐藏

我真的建议你使用像react-native-keychain这样的库在react-native 中存储私有数据

对于 Android API 级别:

  • 16-22 使用 Facebook 隐藏
  • 23+ 使用 Android 密钥库

你可以这样使用它:

// 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);
  });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM