js中常见的数据加密与解密的方法

JavaScript013

js中常见的数据加密与解密的方法,第1张

加密在我们前端的开发中也是经常遇见的。本文只把我们常用的加密方法进行总结。不去纠结加密的具体实现方式(密码学,太庞大了)。

常见的加密算法基本分为这几类,

RSA加密:RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。(这才是正经的加密算法)

非对称加密算法:非对称加密算法需要两个密钥:公开密钥(publickey:简称公钥)和私有密钥(privatekey:简称私钥)。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。

DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法

DES算法的入口参数有三个:Key、Data、Mode。其中Key为7个字节共56位,是DES算法的工作密钥;Data为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。

AES这个标准用来替代原先的DES

DES/AES我们合并在一起介绍其用法和特点

Base64是一种用64个字符来表示任意二进制数据的方法。base64是一种编码方式而不是加密算法。只是看上去像是加密而已(吓唬人)。

(function() {

    "use strict"var e=window.jQuery,t=window.qh360cp,n=window._t.pages.init=function() {

        e("#city_list").siblings(".list").html(t.ui.city.get_city('<li val="<%=code%>"><%=text%></li>'))var n=e("#city_list").val()n&&e("#city").siblings(".list").html(t.ui.city.get_cities(n,'<li val="<%=code%>"><%=text%></li>')),e("#realname").on("keyup blur focusout",function(n) {

            var r=e(this),i=r.val(),s=t.pages.ipt_data_chk.realname(i)t.pages.show_err(r,s.msg,s.code),n.type!="keyup"&&i!=s.val&&r.val(s.val)}

        ),e("#bankno").on("keyup blur focusout",function() {

            var n=e(this),r=n.val()r==n[0].defaultValue&&(r="")var i=t.pages.ipt_data_chk.bankno(r),s=i.msg,o=i.codet.pages.show_err(n,s,o),r!=i.val&&n.val(i.val)}

        ),e("#bankno2").on("keyup blur focusout",function() {

            var n="",r=0,i=e(this),s=i.val(),o=t.pages.ipt_data_chk.bankno(s)s!=e("#bankno").val()&&(n="两次输入的银行卡卡号不一致",r=1),s||(n="请再次输入银行卡卡号",r=1),t.pages.show_err(i,n,r),s!=o.val&&i.val(o.val)}

        ),e("#bankzh").on("keyup blur focusout",function() {

            var n="",r=0,i=e(this),s=i.val()s||(n="请输入支行名称",r=1),t.pages.show_err(i,n,r)}

        ),t.ui.select( {

            sel: "#bank",show_class:"u-select-show",box:".u-select",callback:function(e,t) {

            }

        }

        ),e("#bank").siblings(".list").find(".bank-item").on("click",function(t) {

            var n=e(this),r=n.parents(".u-select")e("#bank").val(n.attr("val")),r.removeClass("u-select-show"),r.find(".txt").html(n.html()),e("#bank_tips").hide(),n.attr("zh")=="1"?e("#bank_zh").show(): e("#bank_zh").hide()

        }

        ),t.ui.select( {

            sel: "#city_list",show_class:"u-select-show",box:".u-select",callback:function(n,r) {

                e("#city").siblings(".list").html(t.ui.city.get_cities(n,'<li val="<%=code%>"><%=text%></li>')),e("#city").val("").siblings(".txt-box").find(".txt").text("请选择")

            }

        }

        ),t.ui.select( {

            sel: "#city",show_class:"u-select-show",box:".u-select",callback:function(t,n) {

                e("#city_tips").hide()

            }

        }

        ),e("#ppass").on("keyup blur foucout",function(n) {

            var r=e(this),i=r.val(),s=t.pages.ipt_data_chk.paypass(i),o=s.msg,u=s.codet.pages.show_err(r,o,u)}

        ),e("#zl_post").on("click",function(e) {

            e.preventDefault()var n=t.pages.chk_data()n?t.lightbox.alert( {

                content: n

            }

            ):t.pages.post()}

        ),t.placeholder.start("#bankno"),e("body").attr("back")&&t.lightbox.show( {

            html: e("#tips_box").html(),cancel_sel:".cls,.close,.lightbox_cancel",confirm_sel:".lightbox_confirm"

        }

        )}

    ,t.pages.chk_data=function() {

        var t=e(".order-bd input:visible").trigger("blur"),nreturn t.each(function(t,r) {

            n=n||e.trim(e(r).siblings(".red").text())}

        ),e("#city").val()||(n=n||e.trim(e("#city_tips").show().text())),e("#bank").val()||(n=n||e.trim(e("#bank_tips").show().text())),e.trim(n)}

    ,t.pages.post=function() {

        var n="fcfa5d2e",r=t.sec.md5(n+"|"+e("#ppass").val()+"|"+n),i=e("#bank").val(),s=e("#realname").val(),o=e("#city").val(),u=e("#bankno").val(),a=e("#bankzh").val(),f="2",l="bankaddr="+a+"&bankid="+i+"&cardno="+u.replace(/%s/g,"")+"&city="+o+"&from="+f+"&paypass="+r+"&realname="+s+"&key=353f32ef57aceb1b90ea4cf2afacb595",c= {

            bankid: i,city:o,bankaddr:a,cardno:u.replace(/%s/g,""),realname:s,paypass:r,from:f,sign:t.sec.md5(l),t:+(new Date)

        }

        ,h=""e("#is_modi").length&&(h="/qbapissl/changebankcard/")var p='<div class="bd"><div class="clearfix">'p+='<p class="gray fsz12">提款绑定的银行卡开户行必须和您之前注册的实名一致,否则无法提款。请确认信息无误后再提交</p>',p+='<p style="padding:15px 0 0 30pxcolor:#666"><b>开户姓名:</b>'+s+"<b>提款银行:</b>"+e.trim(e("#bank").siblings(".txt-box").find(".txt").text())+"<b>银行卡号:</b>"+u+"</p>",p+='<div class="btns text-center">',p+=' <span class="btn-panel btn-panel-primary btn-panel-primary-u lightbox_confirm">确定提交</span>',p+='<span class="btn2 lightbox_cancel">返回修改</span>',p+=" </div></div></div>",t.lightbox.frame( {

            content: p,confirm_sel:".lightbox_confirm",confirm_callback:function() {

                t.pages.post_rst(h,c)

            }

        }

        )}

    ,t.pages.post_rst=function(n,r) {

        t.lightbox.loading("数据提交中..."),e.ajax( {

            url: n||"/qbapissl/bindbankcard/",data:r,type:"post",dataType:"json"

        }

        ).done(function(n) {

            n=n|| {

            }

            if(n.result_code=="9999")t.lightbox.alert( {

                tips_type: 1,content:"恭喜,银行卡绑定成功",confirm_callback:function() {

                    window.location.href="/pftikuan/bankinfo/"

                }

            }

            )else {

                var r=n.message||n.errmsg||"未返回数据"n.result_code=="1329"&&t.pages.show_err(e("#ppass"),r,1),t.lightbox.alert( {

                    content: r

                }

                )}

        }

        ).fail(function() {

            t.lightbox.alert( {

                content: "网络不通,请刷新页面重试一次"

            }

            )}

        )}

    ,e(function() {

        t.pages.init()}

    )}

)()

我不明白您要干什么坏事,分析什么加密,这段js代码只是用于判断,是判断什么的就不用我多说了吧,至于真正的逻辑,是用ajax发送给后台去执行的,数据在后台,前端只是获取并判断。您要怎么更改存在于后台的数据呢?还有您说的post数据是太高端,不是我们常人可以理解的。您这post敢情还是个动词。。还是您其实想说post方式提交,或者发送post请求?

您仔细看看,url是个相对路径,您知道前面的域名么?(虽然猜都能猜出来是360的域名)不知道域名您想怎么发送数据?

总而言之您的说法是前无古人后无来者,吾辈常人无法理解你们的思维

老规矩先用错误信息登陆一下抓一下包,看看有那些post字段:

大概我们就知道我们要分析的字段有nloginpwd其余字段还不清楚,就在上下在看看其他数据包,根据pubkey我们猜测加密方式大概是RSA,继续查看其他数据包,找到一个有价值的get包

信息是:

没有发现明确的关键字,但是可以猜想bg、challenge、patch应该和我们的加密参数相关,但是不确定,只有继续分析加密的js片段:

其中好几个字段都是$("#??")格式,这种表示是来自页面的,那在看看网页源码

果然发现了很多有价值的东西在post表单中的,其中只有两个参数是需要单独获取的,其余都是从html源码里面解析出来的

authcode来源

是获取的源码中的一个值,再看源码

看样子是在验证码操作的时候触发的一个请求,返回的authcode的值,查看authcode请求的数据包

这个请求看起来不是那么友好,有好几个疑似加密字段,这个参数暂时放放,继续分析我们的passWord的加密。

继续深入getEntryptPwd($('#nloginpwd').val()),查看源码

核心的就两行

encrypt.setPublicKey(pubKey)return encrypt.encrypt(pwd)这必定是RSA加密无疑了,继续查看源码,单独的一个源码文件,一共3300多行,删减版如下

JSEncrypt是前端使用的实现RSA加密的库,看样子应该比较标准,那就试试能不能改写了,复制全部源码到node.js,会提示navigator、window未定义,这个问题很简单,在文件头定义

var navigator = this

var window = this

然后在文件尾部写个调用程序试试

是可以成功返回RSA加密结果的

京东的post请求不是太难,参数也能在源码中找到,但是他的难度在发出post请求之前的一个get请求,这个get请求和验证有关,和用户名相关,简单看了一下感觉有点复杂,留在第二篇讲获取authcode参数的其他参数是怎么来的。

ID:Python之战

|作|者|公(zhong)号:python之战

专注Python,专注于网络爬虫、RPA的学习-践行-总结

喜欢研究和分享技术瓶颈,欢迎关注

独学而无友,则孤陋而寡闻!