js aes加密_从一例JS加密案例看JS分析应该具有的思想

最近很久没更新文章了,一方面是该总结的常用东西基本写完了,自己在学习;另一方面是没有新鲜的东西宁愿不写水文,宁愿自己一边玩去。老铁们也没取关,在这里也谢谢你们。我也不满足于去学习优秀的东西,同时要求自己要有创造创新技术,唯有创新方能持久,好东西会有的。今天写这篇文章的原因是前两天一个网友加我,叫我帮他分析一下咕米音乐下载连接数据的加密,他说他研究了有段时间了,今天一时兴起就看了看,最后发现其实挺简单的,但是那位兄弟花了很长时间没理顺,可能是走了思想的弯路,在这里总结一下前端JS分析的一些思想。 案例如下:在咕米音乐点击播放一首歌的时候,后台会发送带有两个加密参数的get请求,该请求会返回该音乐的歌词、MP3资源,返回数据如下:
{returnCode: "000000"msg: "成功"data: {bqPlayInfo: {,…}, hqPlayInfo: {,…}, sqPlayInfo: {,…}}bqPlayInfo: {,…}playUrl: "http://tyst.migu.cn/public/product5th/product28/2019/01/18/2019年01月17日16点09分内容准入启韵文化11首/标清高清/MP3_128_16_Stero/63879704697.mp3"formatId: "020007"salePrice: nullbizType: "00"bizCode: nullhqPlayInfo: {,…}playUrl: "http://tyst.migu.cn/public/product5th/product28/2019/01/18/2019年01月17日16点09分内容准入启韵文化11首/标清高清/MP3_320_16_Stero/63879704697.mp3"formatId: "020010"salePrice: nullbizType: "00"bizCode: nullsqPlayInfo: {,…}playUrl: "http://tyst.migu.cn/public/product5th/product34/2019/07/07/12无损/24bit内容第二批/flac/63879704697.flac"formatId: "011002"salePrice: nullbizType: "00"bizCode: null}
对应的GET请求及携带的加密参数如下:
http://music.migu.cn/v3/api/music/audioPlayer/getPlayInfo?dataType=2&data=U2FsdGVkX19arg01zqCDXVxW71PG32J5HnNmwAi306UYHLlDyCvdX9%2B6%2B%2BhQXTB752iERSoJ0V5dTgKssh%2B0Ow%3D%3D&secKey=pJBMUHMZlB8mU5qnwnJSb%2BNFxGXDbTXACkZAfCWUWKaIkDdd%2FRk5YJee4gmy99j5ENLk5r5lrxVXJqGxXH%2Fpw8Hd6Vt11A509SWbefC2w142BzOelp7Yg%2Fmezni2nJa54e4kJiuR6JAiqPYOg46iyRQabqZ6LvMIVt1TBKvouRg%3D
dataType: 2data: U2FsdGVkX19arg01zqCDXVxW71PG32J5HnNmwAi306UYHLlDyCvdX9+6++hQXTB752iERSoJ0V5dTgKssh+0Ow==secKey: pJBMUHMZlB8mU5qnwnJSb+NFxGXDbTXACkZAfCWUWKaIkDdd/Rk5YJee4gmy99j5ENLk5r5lrxVXJqGxXH/pw8Hd6Vt11A509SWbefC2w142BzOelp7Yg/mezni2nJa54e4kJiuR6JAiqPYOg46iyRQabqZ6LvMIVt1TBKvouRg=
网友说seckey可以用一个固定值,大概看了是RSA加密,那就不管这个参数了,重点分析的参数是data,该data参数。通过全局搜索参数secKey大概确定该请求产生的位置如下:
function(i) {var o;1 === i.rawType ? o = i.raw : 2 === i.rawType && (o = JSON.stringify(i.raw));var s = new e.JSEncrypt;
            s.setPublicKey(t);var a, u = (a = 1e3 * Math.random(),
            r(a).toString()), c = n.encrypt(o, u).toString(), f = s.encrypt(u);return {dataType: i.rawType,data: c,secKey: f
            }
        }
其中data就是我们需要分析的参数,data的值是c,而c是由n.encrypt(o, u).toString()产生的,这里没有明显的标志指示c是何种加密方式,继续向下n.encrypt函数如下:
encrypt: function(n, r, i) {return t(r).encrypt(e, n, r, i)
                   },
然后继续下去,反正结果就是没法看,并且在不知不觉中已经深入其加密的算法内了,然后就是 不识庐山真面目, 只缘身在此山中 。没有标准的入口和标准的调用方式,一层层进入很容易就迷失了,那我们再换一种方法来看,首先看data参数是以U2FsdGVkX1为开头,以==为结尾,这是AES典型的密文,而AES密钥长度在128、192或256位,再看data的生成方法n.encrypt(o, u).toString(),通过端点可以发现u是128位,那我们是不是可以猜想u就是这个AES的密钥。然后利用在线AES测试工具,将得到的data使用u解密,结果如下: 02cc412c3b17fc10bf950a542e82bc8f.png可以发现就得到了正确的明文,因此我们可以判断该加密方式就是标准的AES加密,至于内部函数的层层嵌套我们就不再去探究。 a2690c9570a28e418943f01ddf8b65ae.png关于JS加密解密方面,首先我们要明白密码的加密方式是最重要的,没有信息比密码还要重要,因此密码的加密方式可以作为js加密解密的标准。而密码加密解密基本用标准的加密库,基本没有自己定义算法的(当然也有例外),最多就是封装一下标准加密库,不会去更改加密算法之类的,或者多个加密方式嵌套封装,这是在战略上应该具有的思想。其次从开发者的角度来说也不会使用不标准的加密方式,一方面是标准的加密方式是经过认证的,安全性经过验证,而非标准加密方式安全性无法验证;另一方面是随着公司人员的流动,使用不标准加密方式将给后来人留下无穷后患;其次制定一个新的加密方式难度很大,所以我们首先要从标准的加密方式去考虑并做分析。从对js的防护来说,无限debugg、js混淆是为了增加逆向分析的难度,但是他们还是会使用标准的加密库,而我们只需要找到关键的信息即可。并且在一线互联网的产品中基本不使用上述的措施,因为公司大了,标准开发就尤为重要。那我们如何由结果去推加密方式呢? AES 常以 U2FsdGVkX1为开头,以==为结尾,密钥为128、192或256位 RSA 需要较长的公钥 MD5 当然MD5特征比较明显结果16位  相同的明文得到相同结果 BASE64 编码后字符串一定能被4整除,结尾可能含等号且等号不超过两个当然前端的逆向分析更是一种感觉,只有见多了、练多了才能在头脑中闪现逆向的灵感。

120f60c997f141580a66fe6a269502c2.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值