Security React本机redux持久加密密钥生成
我正在构建一个React本机应用程序,它使用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') 我的问题:(我是一个加密新手)有没有生成一些密钥的最佳实践?我的计划是在应用程序首次启动时随机生成此密钥,并
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