因为公司的项目中用到了接口加密解密,所以百度了一下前端JS加密相关的文章,发现谷歌的CryptoJS挺好用的,因为项目用的是vue框架,记录一下项目中使用经验:
首先使用npm安装CryptoJS
npm install crypto-js
引用
import CryptoJS from 'crypto-js/crypto-js'
在此我引用的是总文件,如果只是用到个别的加密方式,可以单独引用对应的加密JS文件;
加密代码实现
项目中需要将所有传到后台的参数分5个步骤处理:
第一步:排序
第二步:将排序好的参数进行MD5加密作为接口的签名
第三步:将排序好的参数和接口签名拼接上进行AES加密
第四部:将AES加密后的密文Base64加密
第五步:将最终的密文encodeURIComponent;
代码如下:
function encryption(data) {
let strs=[];
for(let i in data){
strs.push(i+'='+data[i]);
}
strs.sort(); // 数组排序
strs=strs.join('&'); // 数组变字符串
let endData=strs+'&sign='+CryptoJS.MD5(strs+'ADfj3kcadc2349akvm1CPFFCD84f')
.toString(); // MD5加密
let key = CryptoJS.enc.Utf8.parse("0880076B18D7EE81"); // 加密秘钥
let iv = CryptoJS.enc.Utf8.parse("CB3EC842D7C69578"); // 矢量
let encryptResult = CryptoJS.AES.encrypt(endData,key, { // AES加密
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7 // 后台用的是pad.Pkcs5,前台对应为Pkcs7
});
return encodeURIComponent(CryptoJS.enc.Base64.stringify(encryptResult.ciphertext)); // Base64加密再 encode;
}
加密最终的密文拼接在接口地址后面,请求接口。后台返回的数据也是密文;解密方法如下:
function decryption(data) {
let key = CryptoJS.enc.Utf8.parse("0880076B18D7EE81"); // 加密秘钥
let iv = CryptoJS.enc.Utf8.parse("CB3EC842D7C69578"); // 矢量
let baseResult=CryptoJS.enc.Base64.parse(data); // Base64解密
let ciphertext=CryptoJS.enc.Base64.stringify(baseResult); // Base64解密
let decryptResult = CryptoJS.AES.decrypt(ciphertext,key, { // AES解密
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
let resData=decryptResult.toString(CryptoJS.enc.Utf8).toString();
return JSON.parse(resData);
}
备注:因为后台返回的数据是json格式;所以做种return的时候使用JSON.parse();如果解密的目标为字符串,比如说需要解密的是一个加密的token值。那就要做相应的改动:
function decryption(data) {
let key = CryptoJS.enc.Utf8.parse("0880076B18D7EE81"); // 加密秘钥
let iv = CryptoJS.enc.Utf8.parse("CB3EC842D7C69578"); // 矢量
let baseResult=CryptoJS.enc.Base64.parse(data); // Base64解密
let ciphertext=CryptoJS.enc.Base64.stringify(baseResult); // Base64解密
let decryptResult = CryptoJS.AES.decrypt(ciphertext,key, { // AES解密
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
return CryptoJS.enc.Utf8.stringify(decryptResult)
}
因为项目比较赶,这个加密解密的过程虽然捣鼓出来了,但是还有很多东西不求甚解,以后会细致研究该加密方式的使用方法,再做补充。