目录
一. 使用场景
接口传参时,默认是明码传输,为了提高安全性,可使用 crypto-js 对参数进行 加密处理
crypto-js —— 一套加密标准的 JavaScript 库
二. 使用方法(以 AES 为例)
2.1 安装 crypto-js
npm install crypto-js
2.2 定义加密密钥及偏移量
加密密钥、偏移量硬性要求:长度必须是 16 的整数倍
import { enc, mode, AES, pad } from 'crypto-js';
// 加密密钥(长度必须是 16 的整数倍,此处为 32 位)
const secretKey = '5405****778e38****fe5a12****b4ce';
// 偏移量
const iv = 'solu********tion';
2.3 AES 加密
/**
* ASE加密
* @description 使用加密秘钥,对 需要加密的参数 进行加密
* @param {string} word - 需要加密的参数
* @param {string} key - 加密密钥(长度必须是 16 的整数倍)
* @param {string} offset - 偏移量
*/
export function aseEncryptParams(word: any, key = secretKey, offset = iv) {
// 未加密的参数 - 从 UTF-8编码 解析出原始字符串
const wordUTF8 = enc.Utf8.parse(word);
// 密钥 - 从 UTF-8编码 解析出原始字符串
const keyUTF8 = enc.Utf8.parse(key);
// 偏移量(在此公司内是固定的) - 从 UTF-8编码 解析出原始字符串
const offsetUTF8 = enc.Utf8.parse(offset);
// 补充
// 把字符串转成 UTF-8编码 —— enc.Utf8.stringify(word);
const encrypted = AES.encrypt(wordUTF8, keyUTF8, {
iv: offsetUTF8,
mode: mode.CBC,
padding: pad.Pkcs7,
});
return encrypted.toString();
}
2.4 AES 解密
/**
* ASE解密
* @description 使用加密秘钥,对 需要解密的参数 进行解密
* @param {string} encryptedWord - 需要解密的参数
* @param {string} key - 加密密钥(长度必须是 16 的整数倍)
* @param {string} offset - 偏移量
*/
export function aesDecryptParams(encryptedWord: any, key = secretKey, offset = iv) {
// 密钥 - 从 UTF-8编码 解析出原始字符串
const keyUTF8 = enc.Utf8.parse(key);
// 偏移量(在此公司内是固定的) - 从 UTF-8编码 解析出原始字符串
const offsetUTF8 = enc.Utf8.parse(offset);
const bytes = AES.decrypt(encryptedWord, keyUTF8, {
iv: offsetUTF8,
mode: mode.CBC,
padding: pad.Pkcs7,
});
return bytes.toString(enc.Utf8);
}
2.5 测试效果
const testASEJM = {
chinese: "中文加密测试",
english: "test",
number: 2,
array: [{
arr: "test",
}],
deepObj: {
children: "deepObj",
deepArr: [{
deep: "deep",
}],
},
};
- 将对象转换为 JSON字符串 后,进行加密:
console.log('result ===', aseEncryptParams(JSON.stringify(testASEJM)));
resutl:// WfwdbmOmIoB0GZ0Mak7o521DRFQ4LY6FV8jEjT41+0mSQG
- 将加密参数进行解密,并转换为 JSON对象:
console.log(
'result ===',
JSON.parse(
aesDecryptParams(
aseEncryptParams(
JSON.stringify(testASEJM)
)))
);resutl:// 复原了