网易云音乐JS下的AES加密参数-分析

一、 背景:
music.163 web 抓包到的接口中,参数被加密处理
分析:
url: http://music.163.com/weapi/user/getfolloweds/?csrf_token=

Params:
8Vzp2g5bLdmnRRyVgdTshm8UcGx1qjuqtAvofKxnLItzCpJHQL/oEC2fDaIOOH8ZgCQ3/3JHj1u6VHYrxDdvOUK0bkK+u+hFMs/xeqpkUI0Uba0KT8Y33a0t4pgcguLxtZz9vcIZAwfu1vDF4PoFCA==

encSecKey:
cf32d343373f8fe86bb70430d70bb47e8c27c43a3cced929080ba9b64bf933ae9a0ed1f10a006ec78135582ba47de03ff4860b3e7e48ff2d8a6cf863d98df2c715e25fcaf79880c693ef3190863ef3378cba816cd213967a836f327142bb84ffaf23f31a27f22746acbd7da4dd0153434eddf5f6f998bcf11b0d692e8730d636
网易云音乐JS下的AES加密参数-分析_第1张图片

二、怎么知道是js中加密的?
1、 加密参数会不会是传送到后台加密,返回再做请求?不管是不是这样,肯定都是要通过js脚本来驱动和促发,并进行参数的赋值,所以,关键词搜索。
2、 看,这两行代码很有可能就是加密参数赋值的地方。
网易云音乐JS下的AES加密参数-分析_第2张图片

三、怎么确定呢?
打个断点试试..果然是呢。
网易云音乐JS下的AES加密参数-分析_第3张图片
网易云音乐JS下的AES加密参数-分析_第4张图片

四、获取加密函数入口:
截取出生成的js段代码:
var bua = window.asrsea(JSON.stringify(bl), bbZ([‘流泪’, ‘强’]), bbZ(Ka.md), bbZ([‘爱心’, ‘女孩’,
‘惊恐’, ‘大笑’]));
bf.data = bm.eX({
params: bua.encText,
encSecKey: bua.encSecKey
})

函数1:window.asrsea(a,b,c,d)
入参1:JSON.stringify(bl),
入参2:bbZ([‘流泪’, ‘强’]),
入参3:bbZ(Ka.md),
入参4:bbZ([‘爱心’, ‘女孩’,’惊恐’, ‘大笑’])
函数2:JSON.stringify(a)
函数3:bbZ([ ])

函数1 = 函数d
window.asrsea = d,
网易云音乐JS下的AES加密参数-分析_第5张图片
网易云音乐JS下的AES加密参数-分析_第6张图片
断点分析后可以发现,四个参数分别是:
d:{\”userId\”:\”39002\”,\”offset\”:\”40\”,\”total\”:\”false\”,\”limit\”:\”20\”,\”csrf_token\”:\”\”}
e: 010001
f: 00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7
g: 0CoJUm6Qyw8W8jud

其中,e,f,g都是固定的常量,只有d是不同请求传入的动态参数。
userId:网易云音乐用户id
offerset:分页起始数量index,第一页0
limit:一页返回数量
其他的固定不变。

五、算法分析逻辑
分析一下d函数里面的加密逻辑可知:
1、 先生成一个16位随机数i
2、 使用g参数作为key,将动态参数d进行加密得encText (加密函数b(a,b))
3、 使用随机数i作为key,将上步加密得到的encText再次加密(加密函数b(a,b))
4、 使用参数e,f作为key,将随机数i进行加密的encSecKey(加密函数c(a, b, c))
好了,这样就得到了两个加密后的参数params(即encText) & encSecKey

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
}

function b(a, b) {
var c = CryptoJS.enc.Utf8.parse(b),
d = CryptoJS.enc.Utf8.parse(“0102030405060708”),
e = CryptoJS.enc.Utf8.parse(a),
f = CryptoJS.AES.encrypt(e, c, {
iv: d,
mode: CryptoJS.mode.CBC
});
return f.toString()
}

function c(a, b, c) {
var d, e;
return setMaxDigits(131), d = new RSAKeyPair(b, “”, c), e = encryptedString(d, a)
}

六、java后台代码调用js脚本进行参数加密
从网易core.js中提取出加密所需要的函数,构建我们自己的本地脚本

Jdk自带script引擎:
1、 创建一个ScriptEngineManager对象
2、 通过ScriptEngineManager获得ScriptEngine对象
3、 用ScriptEngine的eval方法执行脚本

new ScriptEngineManager().getEngineByName(“javascript”);// nashorn

nashorn:从JDK 8开始,Nashorn取代Rhino成为Java的嵌入式JavaScript引擎。Nashorn完全支持ECMAScript 5.1规范以及一些扩展。

你可能感兴趣的:(网络爬虫)