【问题标题】:Is React Native's Async Storage secure?React Native 的异步存储安全吗?
【发布时间】:2016-08-25 15:02:52
【问题描述】:

我想将敏感数据本地存储在 React Native 应用中。

数据是否仅对编写它的应用可用?

【问题讨论】:

标签: react-native asyncstorage


【解决方案1】:

AsyncStorage 不适合存储敏感信息。您可能会发现这很有用:https://github.com/oblador/react-native-keychain

它使用 facebook 隐藏/android 密钥库将加密数据存储到 SharedPreferences (Android) 和 iOS 上的钥匙串。 (我与人合着了这个库)。请务必阅读整个自述文件以了解其提供的内容。

【讨论】:

  • Android 上的 Base64 不是一种安全的数据存储方式
  • @odemolliens 您可能没有注意到保存的base64 编码 字符串已经加密
  • 我又读了一遍源代码,你说得对。但是,如果它已经加密,那么在 Base64 中编码有什么好处呢?欢呼
  • 隐藏库将加密数据返回为字节数组(据我所知),而不是字符串。所以字节数组编码为base64字符串然后保存(sharedPreferences不支持保存字节数组)。
  • 它与世博会配合得很好吗?
【解决方案2】:

不,它不安全,因为它没有加密。我建议你使用 Expo 的 secureStore

如果您是从 Expo 构建您的应用程序:

// in managed apps:
import { SecureStore } from 'expo';

如果您正在构建一个裸应用程序

// in bare apps:
import * as SecureStore from 'expo-secure-store';

在这里阅读更多:https://docs.expo.io/versions/v32.0.0/sdk/securestore/

【讨论】:

  • 这是最新且相关的答案。自从第一次提出这个问题以来,生态系统中发生了很多事情,上面提出的解决方案内置于 expo 中,并且开箱即用,易于使用。
【解决方案3】:

不,AsyncStorage 对敏感数据不安全。 AsyncStorage 只是将数据保存到手机硬盘上的文档中,因此任何有权访问手机文件系统的人都可以读取该数据。当然,这对您来说是否有问题取决于您所说的“敏感数据”是什么意思。

至少在 iOS 上,由于 Apple 的沙盒政策,数据确实只对编写它的应用程序可用。这并不能阻止具有对文件系统的 root 访问权限的越狱 iPhone 获取他们想要的任何内容,因为 AsyncStorage 不会加密其任何数据。但一般来说,不要将敏感数据保存到 AsyncStorage,因为同样的原因,你不应该在 javascript 代码中对敏感数据进行硬编码,因为它很容易被反编译和读取。

【讨论】:

  • iOS 中还有哪些其他存储选项?有没有可以使用的内部数据库?
【解决方案4】:

对于非常敏感的应用或用户数据,您可以在 iOS 上尝试https://github.com/oblador/react-native-keychain(使用 iOS 钥匙串)或在 Android 和 iOS 上尝试https://github.com/classapp/react-native-sensitive-info(使用 Android 共享偏好和 iOS 钥匙串)。

它们都带有非常流畅的 API 和与 react-native link 链接的直接方式,并且是一种更安全的方式来保存您希望远离窥探的数据。

【讨论】:

    【解决方案5】:

    我在一个正在处理的项目中遇到了同样的问题,我们为 AsyncStorage 使用了一个自定义包装器,存储了一些数据,然后我们尝试检索相同的数据......而且非常简单。

    我们通过使用带有加密选项的Realm 解决了这个问题,它比 AsyncStorage 更简单、更快、更好。

    【讨论】:

    • 你是如何存储领域密钥的?我的信念是只能将密钥硬编码或本地存储。
    • 我只是想加密我的信息,这是一个测试项目,所以我将其保留如下:let eKey = new Int8Array(64); // pupulate with a secure keylet realm = new Realm({... encryptionKey: eKey});
    • 您可能 1. 在应用首次启动时生成一个随机密钥。 2. 使用 react-native-keychain 之类的东西将其保存到本机钥匙串。 3. 此后每当您的应用启动时,从钥匙串中获取该钥匙 4. 使用钥匙获取您的领域实例 注意:如果钥匙串被清除,那么您需要吹走领域数据库。
    【解决方案6】:

    不,它不安全。考虑使用像 https://github.com/oblador/react-native-keychain 这样的库来进行安全存储。

    如果您使用 Expo,您可以使用 Expo.SecureStore 加密并在设备本地安全地存储键值对。文档:https://docs.expo.io/versions/latest/sdk/securestore

    【讨论】:

      【解决方案7】:

      我为 redux-persist 创建了一个安全存储模块,它使用 react-native-keychain 存储加密密钥并使用 CryptoJS 加密 AsyncStorage 中的静态 redux-store。您可以在以下位置找到该模块:

      redux-persist-encrypted-async-storage

      它的用法在链接的自述文件中讨论。

      【讨论】:

        【解决方案8】:

        来自 react-native 文档 - https://facebook.github.io/react-native/docs/asyncstorage.html

        AsyncStorage 是一个简单的、未加密的、异步的、持久的、键值对存储系统,对应用程序来说是全局的。

        它不安全,因为它在设备上以未加密的形式存储键值对。

        它使用 iOS 的 keychain 和 Android 的 KeyStore 来安全地存储数据。

        【讨论】:

          【解决方案9】:

          如果你还在寻找这个。
          尝试使用react-native-encrypted-storage 他们有一些加密。
          react-native-encrypted-storage
          它就像异步存储一样简单

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-01-17
            • 2019-10-25
            • 2021-03-18
            • 2021-06-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多