将敏感数据保存在React Native中

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

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

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

在原生应用程序中,我将在iOS使用Keychain ,在Android中使用私有模式中的Shared Preferences

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

在iOS上,AsyncStorage由本地代码支持,将较小的值存储在序列化的字典中,较大的值存储在单独的文件中。 在Android上,AsyncStorage将使用基于可用的RocksDB或SQLite。

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

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

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

Solutions Collecting From Web of "将敏感数据保存在React Native中"

只要深入了解React Native代码,我就find了答案。

Android的

React Native AsyncStorage模块实现基于SQLiteOpenHelper 。 处理所有数据类的包: https : //github.com/facebook/react-native/tree/master/ReactAndroid/src/main/java/com/facebook/react/modules/storage

该类与创build数据库的说明: https : //github.com/facebook/react-native/blob/master/ReactAndroid/src/main/java/com/facebook/react/modules/storage/ReactDatabaseSupplier.java

通过Android文档,应用程序创build的数据库被保存在相关应用程序的专用磁盘空间中,因此它是安全的。

就像您保存在设备内部存储上的文件一样,Android会将您的数据库存储在相关应用程序的专用磁盘空间中。 您的数据是安全的,因为默认情况下,该区域不能被其他应用程序访问。

资源

iOS版

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

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

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

每个应用程序都是岛屿iOS应用程序与文件系统的交互主要限于应用程序沙箱内的目录。 在安装新应用程序的过程中,安装程序会为应用程序创build一些容器。 每个容器都有特定的angular色。 包容器包含应用程序的包,而数据容器包含应用程序和用户的数据。 数据容器被进一步分成许多目录,应用程序可以使用这些目录来sorting和组织数据。 应用程序也可能在运行时请求访问其他容器(例如,iCloud容器)。

资源

结论

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

请注意,这仅适用于没有root权限的 Android设备以及没有越狱的 iOS设备。 另请注意,如果攻击者能够物理访问设备并且设备未受到保护。 他可以将设备连接到Mac笔记本电脑,并提取文档目录,并查看保存在文档目录下的所有内容。

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

这是一个安全问题(至less在iOS上),因为访问该设备的攻击者有可能获得沙箱内容的转储,并通过AsyncStorage简单地提取任何保存的数据。

以前在AsyncStorage.js文档中没有明确说明,但现在是https://github.com/facebook/react-native/pull/8809

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

如果有人想要encryption数据的额外步骤,你可能想看看这个: https : //github.com/oblador/react-native-keychain

它在内部使用了Facebook隐藏 。

我真的build议你使用像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); });