Security React本机redux持久加密密钥生成

Security React本机redux持久加密密钥生成,security,reactjs,encryption,react-native,redux,Security,Reactjs,Encryption,React Native,Redux,我正在构建一个React本机应用程序,它使用redux persist和redux persist transform encrypt在设备上存储加密的应用程序状态redux persist transform encrypt使用CryptoJs通过AES加密数据:CryptoJs.AES.encrypt('serialized app state','some secret key') 我的问题:(我是一个加密新手)有没有生成一些密钥的最佳实践?我的计划是在应用程序首次启动时随机生成此密钥,并

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


我的问题:(我是一个加密新手)有没有生成
一些密钥的最佳实践?我的计划是在应用程序首次启动时随机生成此密钥,并将其安全地存储在设备密钥链中。

我们使用React Native密钥链存储随机生成密钥,以确保即使攻击者有权访问文件系统,也难以获取密钥:

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()
}

您可以使用一些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);
    }
  }

下面我们来探讨各种配置

肯定不是答案,但可能会帮助您了解这个主题。
react native keychain
是存储吗?我正在使用
redux persist
,除了
AsyncStorage