公司要求前端html页面,像后台发送数据的时候,进行加解密(DES、base64)和签名(md5),就在网上查了各种资料,遇到的问题和解决方法如下:
常用加解密类js下载地址:https://cdnjs.com/libraries/crypto-js
1)前端自己加解密过程走通
公司文档要求,先做des加密,在做base64转码,并用md5签名
<script src="script/base64.js"></script>
<script src="script/md5.js"></script>
<script src="script/crypto-js.js"></script>
按照文档的加解密前端调通(秘钥必须为:8/16/32位)。
部分代码如下:
des加密:
var key = "12345678"
var str = "admin";
//加密
var encrypt = CryptoJS.DES.encrypt(str, CryptoJS.enc.Utf8.parse(key), {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
}).toString();
console.log(encrypt);
//解密
var decrypt = CryptoJS.DES.decrypt(encrypt, CryptoJS.enc.Utf8.parse(key), {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
}).toString(CryptoJS.enc.Utf8);
console.log(decrypt);
输出:
TMR29YtnGPI=
admin
base64:
var str="admin";
var encryPtBase64 = Base64.encode(encrypt);
var decryptBase64 =Base64.decode(encryPtBase64 ,"Unicode");
md5:
var str="admin";
var signStr = hex_md5(str);
2)然后从后台找了测试数据进行测试
后台字符串"admin"经des加密和base64转化后得到字符串:
K6CG7IXQGv4=
与前端得到的数据不一致,调试过程中发现,经crypto-js.js进行md5加密的数据上述写法,已经转化为base64格式的,不需要在次进行base64转化,后台采用的加密模式是: mode: CryptoJS.mode.CBC,
//iv CBC模式下不可省
//加密
var key = "12345678"
var str = "admin";
var ivHex = CryptoJS.enc.Utf8.parse(key);
var encryptStr = CryptoJS.DES.encrypt(str, CryptoJS.enc.Utf8.parse(key), {
iv:ivHex,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
}).toString();
console.log('admin-',encryptStr)
//解密
var result = CryptoJS.DES.decrypt(encryptStr, CryptoJS.enc.Utf8.parse(key), {
iv:ivHex,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
}).toString(CryptoJS.enc.Utf8);
console.log('result---',result);
完成可正常与后端进行加解密
3)单步的des加密
后端des加密的时候,返回的是一个字节数组,前端如下处理可以验证一致性
var desStr=encryptByDESModeCBC('admin');
console.log('desStr----',desStr);
//CBC模式加密
function encryptByDESModeCBC(message) {
var keyHex = CryptoJS.enc.Utf8.parse('12345678');
var ivHex = CryptoJS.enc.Utf8.parse('12345678');
var encrypted = CryptoJS.DES.encrypt(message, keyHex, {
iv:ivHex,
mode: CryptoJS.mode.CBC,
padding:CryptoJS.pad.Pkcs7
}
);
//将字节数组转化成16进制字符串
return encrypted.ciphertext.toString();
}
遇到的问题解决,标记一下。
网友评论