为了账号安全,请及时绑定邮箱和手机立即绑定

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 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消