【问题标题】:React Native redux-persist encryption key generationReact Native redux-persist 加密密钥生成
【发布时间】:2017-04-30 02:29:06
【问题描述】:

我正在构建一个 React Native 应用程序,它使用 redux-persistredux-persist-transform-encrypt 在设备上存储加密的应用程序状态。 redux-persist-transform-encrypt 使用 CryptoJs 通过 AES 加密数据:CryptoJS.AES.encrypt('serialized app state', 'some-secret-key')

我的问题:(我是加密新手)是否有生成some-secret-key 的最佳实践?我的计划是在应用首次启动时随机生成此密钥,并将其安全地存储在设备钥匙串中。

【问题讨论】:

  • 绝对不是答案,但this discussion 可能会帮助您对这个话题有所了解。

标签: security reactjs encryption react-native redux


【解决方案1】:

我们使用 React Native Keychain 来存储随机生成的密钥,以确保即使攻击者可以访问文件系统也更难获得密钥:

let secretKey

async function getSecretKey() {
  let {password} = await Keychain.getGenericPassword()
  if (!password) {
    password = generateRandomKey()
    await Keychain.setGenericPassword(appName, password)
  }
  return password
}

const encrypt = async function(state) {
  if (!secretKey) {
    secretKey = await getSecretKey()
  }

  if (typeof state !== 'string') {
    state = stringify(state);
  }

  return CryptoJS.AES.encrypt(state, secretKey).toString()
}

【讨论】:

  • react-native-keychain 是一个存储吗?我正在使用redux-persist 并且不知道除了AsyncStorage 之外存储加密数据的存储空间@
【解决方案2】:

您可以使用一些 uuid 生成器来生成随机密钥。然后将其存储在@jimchao 所说的钥匙串中。如果您使用的是 expo,您可以编写如下内容:

import Expo from 'expo';

export const getFromSecureStore = (key, options) =>
  Expo.SecureStore.getItemAsync(key, options);

export const saveToSecureStore = (key, value, options) =>
  Expo.SecureStore.setItemAsync(key, value, options);

然后将其用作:

// 登录时

function* handleSignInRequest(action) {
  try {
    const resp = yield RequestService.post(
      action.payload.url,
      action.payload.body,
    );
    yield put({ type: SIGN_IN_SUCCEEDED, payload: resp.data });
    const { username, password } = action.payload.body;
    yield saveToSecureStore('username', username, {
      keychainAccessible: Expo.SecureStore.ALWAYS, // can be changed as per usage
    });
    yield saveToSecureStore('password', password, {
      keychainAccessible: Expo.SecureStore.ALWAYS,
    });
  } catch (error) {
    console.log('======>>  signin error', error);
    yield put({ type: SIGN_IN_FAILED, error: error.response });
  }
}

// 在应用启动时

async handleSignInAtBootstrap() {
    try {
      const username = await getFromSecureStore('username');
      const password = await getFromSecureStore('password');
      this.props.signInUser(username, password); //dispatch an action
    } catch (error) {
      console.log('======>>>', error);
    }
  }

这里是Expo secure store docs 来探索各种配置

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    • 2017-08-11
    • 1970-01-01
    • 1970-01-01
    • 2016-12-05
    • 2017-08-27
    相关资源
    最近更新 更多