在查阅了无数帖子之后实现了,评论的获取,现在捋一捋思路,重新扒一下网易云请求包里的两个参数params和encSecKey到底如何获取。昨天试了设置断点,写了一大串的js代码,头晕眼花,今天梳理一下其他的思路。
AES和RSA的加密
AES:对称加密
RAS:非对称加密
AES 算法的一个主要问题是,作为一种对称算法,它要求加密方和解密方使用相同的密钥。在包括互联网在内的许多现代通信环境中,大量交换的数据都通过快速 AES 算法进行加密。为了获得解密数据所需的密钥,授权接收者发布一个公钥,同时保留一个只有他们知道的相关私钥。然后,发送方使用该公钥对他们自己的 AES 密钥进行RSA加密传输给接收方,接收方使用私钥解密得到AES密钥,再用该密钥对数据进行解密
所以params和encSecKey是每页分发一个,并且其中里面的key是随机生成的
可以看到在页面切换的时候,每页都会动态生成一个params和encSecKey,由此保护用户的信息。跑到源代码中扒一扒
检索定位一下,开搞。
对三个位置打断点,通过打断点可以看出bVi0x中encText就是params,bVi0x中的encSecKey就是动态的encSecKey。
而var bVi0x = window.asrsea(JSON.stringify(i1x), bse6Y(["流泪", "强"]), bse6Y(Qu9l.md), bse6Y(["爱心", "女孩", "惊恐", "大笑"]));
所以重要的就是通过破解这里面的4个参数。a/b/c/d,之前就是通过打断点的方式求,现在跟着大佬仔细的看看这几个参数。
a参数
a就可以看到是一个16位的随机数,在下面一串字符里面随机选取
b参数
是一个AES的加密,密钥偏移量iv是0102030405060708,模式是CBC
c参数
是一个RSA加密,16进制的公钥跟生成位数都已经有了,然后加密参数a是那个16位随机数,这里注意AES加密的key和RSA加密的参数,都是这个16位随机数(只生成一次)可以看出c参数是由i,e,f决定的(下面也论述了i为随机的a(16))
function d(d, e, f, g) {
var h = {}
, i = a(16);
return h.encText = b(d, g),
h.encText = b(h.encText, i),
h.encSecKey = c(i, e, f),
h
}
通过打断点的方式可以运行出来3个参数的值
a= ‘939WGNKS5imuARkb’(随机的16位)
b= ‘010001’
c= ‘00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7’
函数中最重要的4个参数:d/e/f/g
按照之前打断点的方式获取,已经出现了后面的数值
d:‘{“songId”:“2061978961”,“csrf_token”:“96c2f447c74dfeca4659326ac9c02f87”}’
e:‘010001’
f:‘00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7’
g:‘0CoJUm6Qyw8W8jud’
继续运行断点,可以看到参数已经传过来拉
d:‘{“rid”:“R_SO_4_2061978961”,“threadId”:“R_SO_4_2061978961”,“pageNo”:“1”,“pageSize”:“20”,“cursor”:“-1”,“offset”:“0”,“orderType”:“1”,“csrf_token”:“96c2f447c74dfeca4659326ac9c02f87”}’
e:‘010001’
f:‘00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7’
g:‘0CoJUm6Qyw8W8jud’
所以!rid就是R_SO_4_加上歌曲的id,pageNo就是评论页数, pageSize为20!
h:{
“encText”: “fBb/othviiEa4ci7jmc6HkekhM5hj6/W4ROT9WcOjF0lpuZZw+9hhnVlf6sGjRXPL7wj/cIbeHsrHaVhtCZ5AfnTIiV4+pWgnuA2na05mghEErwaScTvFadZWI9RYq7G5v6t+5zr5Pxa0p4KcuhtWijU+Ist+Inu1vD05j5l8TLQyv7tE2LU/XavCOLOEHodNnI5PwXd1xAVGUIfnt9sDsaiCAnFJGt2akUFHHdBACmRkmszfp76+TJuKZ2uWm43gR5DjQT6jQ9pZPA6JUWhddJiqeHyZ9V1hOMLzfzFhvDOxV5PIUg/ytGG7P2VBX7A5eGfl+nRHQDfCQJmail0GHqAYJosvtyneWGSxziWonQ=”,
“encSecKey”: “936129d4ef4dc02e284fb41fa9c23f96ec569516b59cbf0f132f1a4f0ff3ab48865c7f6c78cdf81b5c95f0103df26fd8f9da604ced9ae08b3192301b29b4b8fea7ed70e64192f60cdd3d4d70fa60627f443095783621d0c3594024ee7f51be5c56ef7b0d3544d83cc52896d434ee1fcbd2f58874298703343d9b0aec625e2e10”
}
i:‘Js0s1xrEglJDfo30’
可见h就是我们想要的encText和encSecKey,再来一页看看下一个params和encSecKey。
d:‘{“rid”:“R_SO_4_2061978961”,“threadId”:“R_SO_4_2061978961”,“pageNo”:“3”,“pageSize”:“20”,“cursor”:“1714612092219”,“offset”:“0”,“orderType”:“1”,“csrf_token”:“96c2f447c74dfeca4659326ac9c02f87”}’
e:‘010001’
f:‘00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7’
g:‘0CoJUm6Qyw8W8jud’
通过对比可以发现"cursor"是时间戳的意思,其他都没变化
有生成了新的:
h:{
“encText”: “2MdmhD0ab57caPbr5ErSmZBV3qzvWxtL4dmwlTp3/aqJRTVv0WTPvyHzFAGWOkA1BjNVRVohzZKLYPfrA5mtKbypxEQBgzjZkUipcgi2fQvG6ktBSxvY4Qdw0dEhtn1g5wPdnya//dwFI3Cw1qucssQZasRtjjDtLNY6gVrGiL9JyZyX4D+FKDjZKeXt1NRxKNmYJP4AlEO+l2QEejOK20RJUjgt2At5WnTkv8f0aMdL+twQ1ddcz8x3YovUOt8gy0CA0FfGx2jNDtubDEDD4HF3zRlcR85xBFc0O0MlzNSPQpq9MfPYPBDTfLBGHMKwN5eSE6tqZuhZ2OfH+viuZKDK88HSDhKpyRqYeEXuDPQ=”,
“encSecKey”: “3817f63a2fc5552e71365bcc3166a4e80a23e05e43edbfc3818393122ba953c467b02b6796f4190c8e8cef78a5b3ef6a619958a485df46fb25f487e60f9cebb568ff3814f52ec6aa66f11a15e8abb46f2fe41f71f20dca83967742de03d42f6202c52ed011019aeb2fb5b7fbfb40d179b8e8d74b94d87e5f344f96a24a8821c5”
}
i:‘Xg3v133pa0NkM1HG’
这就是我们想要实现的动态加密内容,每页不同的params和encSecKey从a-h的参数我们都有了!i就是从a里面随机选取的16个随机数,看函数:
既然是随机的,就可以直接给他赋值了,就随便赋值为**i:‘Xg3v133pa0NkM1HG’**吧。继续扒源代码发现:b函数就是一个AES加密,而encText的获得经过了两次加密,第一次对 d 加密,key是第四个参数(d,e,f,g),第二次对第一次加密结果进行加密,key是 i ,就是代码中的 h.encText = b(h.encText, i),
再来一页观察一下:
a:‘QXUhN1LAM75DG91v’
b:‘010001’
c:‘00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7’
d:‘{“rid”:“R_SO_4_2061978961”,“threadId”:“R_SO_4_2061978961”,“pageNo”:“4”,“pageSize”:“20”,“cursor”:“1714592794590”,“offset”:“0”,“orderType”:“1”,“csrf_token”:“96c2f447c74dfeca4659326ac9c02f87”}’
e:‘010001’
f:‘00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7’
g:‘0CoJUm6Qyw8W8jud’
h:{
“encText”: “J/g82854xqvFGYu3tzjHGQAWAQZWI4NoxQR0zphnha8EdpX+70xLoF74+YfA9y2JVft3Bph66JqgZTh1dZR9aJyxSkiZaQdA08DJlgvnbLxj/fCqifHO2KkNlYHr2Pon4AfurYvHI+IUOkGtKuuSJfnoq0rpiuFpIx78gL8cmnTunURoZFszcTNpfeZluxLfJOhc0IHKR/dnlAxnxDuf3vIwI/383QBDxQv4HBblpRVcBe5LvWcicyP69ZNSksQw9ScbiK4Dk6lpXQRcAWjKhPy5/4EGhu7uWACc3U2fKpinkCXLYP53bIPlDHOkPK6dVCuo75EUjzPEkXNNBgry8O1Wf4ALLrhOv6dXIRBOrjs=”,
“encSecKey”: “27695d7dca9d7ce108280ff40a52c2f64df972a788bdd3cebe863b4f0e4ec05ff6e8b573ccd03918fb344a76c6cbdc873f86dde633b1d6af02e270baaf61f7ce06e0ee6cf110f5059322b3b13a403f4e382f2f8cdecdedccbac3cf3309e824e9f4bb7f219ecb105a769a057e181098a4c52f8ac689a38a6f7de13a45b3e9ec48”
}
i:‘74sJ2X5586rJsuA2’
总结
参数a和参数i都是随机的16位数,可以自由设定。
参数b和参数e即是AES加密的key,两者一致。
参数c和参数f一致,是RSA加密的密钥,全部是固定的值,不随歌曲id和页数变化。
参数g没有变化过,一直是 g:‘0CoJUm6Qyw8W8jud’