2). 创建加密工具类
// 获取Aes加密
// npm i aes-js
let aes = require('aes-js');
// 默认KEY - An example 128-bit key
let _key = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 ];
// 默认IV - The initialization vector (must be 16 bytes)
let _iv = [ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,35, 36 ];
/**
* @FileName: AesUtil
* @Author: mazaiting
* @Date: 2018/7/5
* @Description: AES加密工具类,使用方法
* 加密
* let encrypted = AesUtil.encrypt("mazaiting");
* 解密
* let decrypted = AesUtil.decrypt("mazaiting");
*/
class AesUtil {
/**
* 设置KEY
* @param key 密钥
*/
static key(key) {
if (key.length / 16 !== 0 ) {
console.warn("密钥无效...")
}
_key = key;
}
/**
* iv设置无效
* @param iv iv
*/
static iv(iv) {
if (iv.length / 16 !== 0 ) {
console.warn("密钥无效...")
}
_iv = iv;
}
/**
* 加密
* @param text 加密文本
*/
static encrypt(text) {
// 将文本转换为字节 - Convert text to bytes
let textBytes = aes.utils.utf8.toBytes(text);
// 设置加密模式为 - ofb ( Output Feedback )
let aesOfb = new aes.ModeOfOperation.ofb(_key, _iv);
// 加密数据
let encryptedBytes = aesOfb.encrypt(textBytes);
// 将二进制转换为16进制数据 - To print or store the binary data, you may convert it to hex
return aes.utils.hex.fromBytes(encryptedBytes);
}
/**
* 解密
* @param text 待解密文本
*/
static decrypt(text) {
// 将文本转换为字节 - When ready to decrypt the hex string, convert it back to bytes
let encryptedBytes = aes.utils.hex.toBytes(text);
// 设置 解密模式
// The output feedback mode of operation maintains internal state,
// so to decrypt a new instance must be instantiated.
let aesOfb = new aes.ModeOfOperation.ofb(_key, _iv);
// 解密数据
let decryptedBytes = aesOfb.decrypt(encryptedBytes);
// 将字节数据转换为字符串 - Convert our bytes back into text
return aes.utils.utf8.fromBytes(decryptedBytes);
}
}
/**
* 导出当前Module
*/
module.exports = AesUtil;
3). RN中对Storage数据存取进行加密
import React from 'react';
import {AsyncStorage} from 'react-native';
// npm install react-native-storage --save
import Storage from 'react-native-storage';
// 导入Aes加密工具类
import AesUtil from './../encrypt/AesEncrypt';
class LocalStorage extends Storage {
/**
* 存储数据
* @param params 参数
*/
save(params) {
// console.log(params);
// 加密key
if (params.hasOwnProperty("key")) {
let key = params.key;
// 设置加密后的数据
params.key = AesUtil.encrypt(key)
}
// 加密data
if (params.hasOwnProperty("data")) {
let data = params.data;
let keys = Object.keys(data);
// 遍历所有的key
for (let i in keys) {
// 获取键值
let key = keys[i];
let value = data[key];
// 加密键值
// let encryptKey = AesUtil.encrypt(key);
// 设置对应键的值
data[key] = AesUtil.encrypt(value);
}
// console.log("encrypt: " + JSON.stringify(data));
// 设置加密后的数据
params.data = data
}
// console.log(params);
super.save(params);
}
/**
* 加载数据
* @param params 参数列表
*/
load(params) {
// console.log(params);
// 加密key
if (params.hasOwnProperty("key")) {
let key = params.key;
// 设置加密后的数据
params.key = AesUtil.encrypt(key)
}
// console.log(params);
// 加载数据
return new Promise((resolve, reject) => {
return super.load(params).then(data => {
// 如果找到数据,解密
let keys = Object.keys(data);
// 遍历所有的key
for (let i in keys) {
// 获取键值
let key = keys[i];
let value = data[key];
// 加密键值
// let encryptKey = AesUtil.encrypt(key);
// 设置对应键的值
data[key] = AesUtil.decrypt(value);
}
// console.log("en-data: " + JSON.stringify(data));
return resolve(data)
}).catch(reason => {
reject(reason)
})
});
}
}
const storage = new LocalStorage({
// 容量
size: 1000,
// RN 使用 AsyncStorage
storageBackend: AsyncStorage,
// 有效时间
defaultExpires: 1000 * 3600 * 24,
// 缓存数据在内存中
enableCache: true,
// 数据过期时调用
sync: {}
});
// RN
global.storage = storage;