js加解密与后端联调
标签:
JavaScript
公司要求前端html页面,像后台发送数据的时候,进行加解密(DES、base64)和签名(md5),就在网上查了各种资料,遇到的问题和解决方法如下:
1)前端自己加解密过程走通
公司文档要求,先做des加密,在做base64转码,并用md5签名
<script class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="script/base64.js"></script> <script class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="script/md5.js"></script> <script class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="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(); }
作者:月纱儿
链接:https://www.jianshu.com/p/a0676262aeec
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦