作者前言这是我的gitee仓库:https://gitee.com/qin-laoda/python-exercises有兴趣的小可爱们可以点进去看看,目录常见的js加密算法微信公众号的简单案例________________________________鉴于有一些小可爱对于js逆向的理解还有一些不解,下面我会再进一步的介绍js逆向,常见的加密算法 1.线性散列的MD5算法2.对称加密DES/AES算法3.非对称加密算法RSA4.base64伪加密5.https证书钥加密js逆向-MD5加密(理论上无法破解)MD5是一种被广泛使用的线性散列算法,可以产生一个128位(16字节)的散列值(hashvalue),用户确保信息传输完整的一致性。且MD5加密之后产生的是一个固定长度(32位或16位)的数据解密:常规讲MD5是不存在解密的,但是理论上MD5可以反向暴力破解,暴力破解的原理就是用很多不同的数据进行加密后跟已有加密数据进行对比,由此来寻找规律。理论上只要数据量足够庞大即可,但是实际中要考虑破解成本(时间和机器性能)。假设破解当前MD5密码需要目前计算能力最优秀的计算机工作100年才能完成破解,那么当前的MD5密码就是安全的增加破解成本的方法使用一段无意义且随机的私钥进行MD5加密会生成一个加密串,称为串1将要加密的数据跟串1拼接,再进行一次MD5,这时会生成串2将串2再次进行MD5加密,这时生成的串3就是我们加密后的数据我们在注册账号时密码一般都是MD5加密AESDES对称加密(用一个密钥加密解密)DES全称为DataEncryptionStandard,即数据加密标准,是一种使用秘钥加密的算法,该加密算法是一种对称加密方式,其加密运算、解密运算需要使用的是同样的秘钥(一组字符串)即可。注意:现在用的AES这个标准来替代原先的DESAES和DES的区别:加密后秘文长度的不同DES加密后密文长度是8的整数倍AES加密后密文长度是16的整数倍应用场景的不同企业级开发使用DES足够安全如果要求更高使用AESDES和AES切换只需要修改CrytoJS.AESCryptoJS.DES使用DES/AES进行数据交换时要求双方都拥有相同的私钥破解方法:暴力破解DES如果使用56位的秘钥,则可能的秘钥数量是2的56次方个。只要计算足够大是可以破解的DES算法的入口参数有三个:Key、Data、Mode、paddingKey为7个字节共56位,是DES算法的工作秘钥Data为8字节64位,是要被加密或被解密的数据Mode为DES的工作方式padding为填充模式,如果加密后密文长度如果达不到指定整数倍(8字节、16字节),填充对应字符。padding的赋值固定为CryptoJS.pad.Pkcs即可RSA加密(公钥加密,私钥解密)RSA加密算法是一种非对称加密算法。在公开秘钥加密和电子商业中RSA被广泛使用非对称加密算法需要两个秘钥:公开秘钥(publickey:简称公钥)私有秘钥(privatekey:简称私钥)公钥和私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密,因为加密和解密使用的是两个不同的秘钥,所以这种算法叫做非对称加密算法注意:使用时都是使用公钥加密使用私钥解密。公钥可以公开,私钥自己保留算法强度复杂、安全性依赖于算法于秘钥但是由于其算法复杂,而是的加密解密速度没有对称加密的速度快使用流程和场景介绍:通过公钥加密,使用私钥解密,私钥是通过公钥计算生成的,假设ABC三方之间相互要进行加密通信。大家相互之间使用公钥进行信息加密,信息读取使用各自对应的私钥进行信息解密用户输入的支付密码会通过RSA加密公钥私钥生成方式:公私钥可以可以在线生成:http://web.chacuo.net/netrsakeypairbase64伪加密(一种编码格式)Base64是一种用64个字符来表示任意二进制数据的方法。base64是一种编码方式而不是加密算法,知识看上去像是加密而已使用A-Z,a-z,0-9,+,/这64个字符实现对数据加密https加密https是基于http和SSL/TLS实现的一个协议,它可以保证在网络上传输的数据都是加密的,从而保证数据安全如何实现httpshttp协议是不安全的在https诞生之前,所有网站都是使用的http协议,而http协议在数据传输的过程中都是明文,所以可能存在数据泄露和篡改使用对称秘钥进行数据加密为了防止数据泄露和篡改,我们对数据进行加密,如:生成一个对称密码,将对称秘钥分别交给浏览器和服务器端,他们之间传输的数据都使用对称秘钥进行加密和解密 3.请求和响应流程如下:客户端使用对称秘钥对请求进行加密,并发送给服务器服务端接收到密文后,使用对称秘钥对密文进行解密,然后处理请求,最后再使用对称秘钥把返回的内容再次加密,返回给看客户端客户端接收密文之后,使用对称秘钥进行解密,并获取最终的响应内容这样,数据局传输传输都是密文,解决了明文传输数据的问题,但是这样会有bug。浏览器如何获取对称秘钥每个客户端的对称秘钥相同,浏览器能拿到对称秘钥,那黑客也能拿到,所以数据加密就没有意义了动态对称秘钥和非对称秘钥 上图就是理论上通过RSA的原理来发送密钥,缺点就是无法知道客户端接收的公钥是不是服务器的这样就解决了动态对称秘钥和数据加密的问题,因为每个用户的对称秘钥都是随机生成且传输的过程都使用公钥加密(公钥的加密数据只能有私钥能解密),所有何可无法截获对称秘钥。而数据传输是通过对称秘钥加密过的,所以黑客即使能获取数据也无法去解密可看到真是的内容,看似无懈可击,但是这样还是会出现bug如果黑客在步骤2进行劫持,把自己的公钥返回给客户端,那客户端会使用黑客的公钥来加密对称秘钥,黑客在步骤6截获请求,使用自己的私钥获取对称秘钥,后面过程全都失去作用CA证书的应用证书就是提供密钥,由可靠平台颁布抓包工具就是一个代理服务器,接收客户端发来的数据然后再发送给服务器下面我们来一个简单的案例链接:https://mp.weixin.qq.com/操作:输入密码和账号并打开开发者工具找到对应接口 可以看出上图加密的是32位可以大概判断是MD5加密然后找到对应的js文件进行打断点,运行 js代码:functionp(e,t){varn=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(n>>16)<< 16 | 65535 & n } function a(e, t, n, i, o, s) { return p((t = p(p(t, e), p(i, s))) << o | t >>>32-o,n)}functionl(e,t,n,i,o,s,r){returna(t&n|~t&i,e,t,o,s,r)}functiong(e,t,n,i,o,s,r){returna(t&i|n&~i,e,t,o,s,r)}functionm(e,t,n,i,o,s,r){returna(t^n^i,e,t,o,s,r)}functionh(e,t,n,i,o,s,r){returna(n^(t|~i),e,t,o,s,r)}functionr(e,t){e[t>>5]|=128<< t % 32, e[14 + (t + 64 >>>9<< 4)] = t; for (var n, i, o, d, s = 1732584193, r = -271733879, a = -1732584194, c = 271733878, u = 0; u < e.length; u += 16) s = l(n = s, i = r, o = a, d = c, e[u], 7, -680876936), c = l(c, s, r, a, e[u + 1], 12, -389564586), a = l(a, c, s, r, e[u + 2], 17, 606105819), r = l(r, a, c, s, e[u + 3], 22, -1044525330), s = l(s, r, a, c, e[u + 4], 7, -176418897), c = l(c, s, r, a, e[u + 5], 12, 1200080426), a = l(a, c, s, r, e[u + 6], 17, -1473231341), r = l(r, a, c, s, e[u + 7], 22, -45705983), s = l(s, r, a, c, e[u + 8], 7, 1770035416), c = l(c, s, r, a, e[u + 9], 12, -1958414417), a = l(a, c, s, r, e[u + 10], 17, -42063), r = l(r, a, c, s, e[u + 11], 22, -1990404162), s = l(s, r, a, c, e[u + 12], 7, 1804603682), c = l(c, s, r, a, e[u + 13], 12, -40341101), a = l(a, c, s, r, e[u + 14], 17, -1502002290), s = g(s, r = l(r, a, c, s, e[u + 15], 22, 1236535329), a, c, e[u + 1], 5, -165796510), c = g(c, s, r, a, e[u + 6], 9, -1069501632), a = g(a, c, s, r, e[u + 11], 14, 643717713), r = g(r, a, c, s, e[u], 20, -373897302), s = g(s, r, a, c, e[u + 5], 5, -701558691), c = g(c, s, r, a, e[u + 10], 9, 38016083), a = g(a, c, s, r, e[u + 15], 14, -660478335), r = g(r, a, c, s, e[u + 4], 20, -405537848), s = g(s, r, a, c, e[u + 9], 5, 568446438), c = g(c, s, r, a, e[u + 14], 9, -1019803690), a = g(a, c, s, r, e[u + 3], 14, -187363961), r = g(r, a, c, s, e[u + 8], 20, 1163531501), s = g(s, r, a, c, e[u + 13], 5, -1444681467), c = g(c, s, r, a, e[u + 2], 9, -51403784), a = g(a, c, s, r, e[u + 7], 14, 1735328473), s = m(s, r = g(r, a, c, s, e[u + 12], 20, -1926607734), a, c, e[u + 5], 4, -378558), c = m(c, s, r, a, e[u + 8], 11, -2022574463), a = m(a, c, s, r, e[u + 11], 16, 1839030562), r = m(r, a, c, s, e[u + 14], 23, -35309556), s = m(s, r, a, c, e[u + 1], 4, -1530992060), c = m(c, s, r, a, e[u + 4], 11, 1272893353), a = m(a, c, s, r, e[u + 7], 16, -155497632), r = m(r, a, c, s, e[u + 10], 23, -1094730640), s = m(s, r, a, c, e[u + 13], 4, 681279174), c = m(c, s, r, a, e[u], 11, -358537222), a = m(a, c, s, r, e[u + 3], 16, -722521979), r = m(r, a, c, s, e[u + 6], 23, 76029189), s = m(s, r, a, c, e[u + 9], 4, -640364487), c = m(c, s, r, a, e[u + 12], 11, -421815835), a = m(a, c, s, r, e[u + 15], 16, 530742520), s = h(s, r = m(r, a, c, s, e[u + 2], 23, -995338651), a, c, e[u], 6, -198630844), c = h(c, s, r, a, e[u + 7], 10, 1126891415), a = h(a, c, s, r, e[u + 14], 15, -1416354905), r = h(r, a, c, s, e[u + 5], 21, -57434055), s = h(s, r, a, c, e[u + 12], 6, 1700485571), c = h(c, s, r, a, e[u + 3], 10, -1894986606), a = h(a, c, s, r, e[u + 10], 15, -1051523), r = h(r, a, c, s, e[u + 1], 21, -2054922799), s = h(s, r, a, c, e[u + 8], 6, 1873313359), c = h(c, s, r, a, e[u + 15], 10, -30611744), a = h(a, c, s, r, e[u + 6], 15, -1560198380), r = h(r, a, c, s, e[u + 13], 21, 1309151649), s = h(s, r, a, c, e[u + 4], 6, -145523070), c = h(c, s, r, a, e[u + 11], 10, -1120210379), a = h(a, c, s, r, e[u + 2], 15, 718787259), r = h(r, a, c, s, e[u + 9], 21, -343485551), s = p(s, n), r = p(r, i), a = p(a, o), c = p(c, d); return [s, r, a, c] } function c(e) { for (var t = "", n = 0; n < 32 * e.length; n += 8) t += String.fromCharCode(e[n >>5]>>>n%32&255);returnt}functionu(e){vart,n=[];for(n[(e.length>>2)-1]=void0,t=0;t>5]|=(255&e.charCodeAt(t/8))<< t % 32; return n } function i(e) { for (var t, n = "0123456789abcdef", i = "", o = 0; o < e.length; o += 1) t = e.charCodeAt(o), i += n.charAt(t >>>4&15)+n.charAt(15&t);returni}functiond(e){returnunescape(encodeURIComponent(e))}functiono(e){returnc(r(u(e=d(e)),8*e.length))}functions(e,t){varn,e=d(e),t=d(t),i=u(e),o=[],s=[];for(o[15]=s[15]=void0,16
|