某东抢购sk算法剖析
sk是什么
sk是某东抢购提交订单时,必要的一个参数,是防止自动化提交订单的一种手段,靠一段加密js动态生成。
sk是如何计算出的
根据抓包分析过程,发现sk是一段加密js生成的,具体如何抓包,可以查阅我之前写的文章
加密js接口
https://tak.jd.com/a/tr.js?_t=2685900
用浏览器打开返回是这样的
一般人,越到这种情况,就望而却步了,但是为了抢到茅台,还是稍微看了下格式化后的代码,发现一个关键性的一点,如下图中b函数的推导过程
加密的主要逻辑
- js代码中很多字符串,是以a b c 等数组下标替换了
- 仔细观察发现所有的数组名称,a1, a2…等等,其实都等于b
- b已经可以上图标红函数推导出和a的关系,其实b表示的字符串,就是a表示的字符串数字下标减去一个数字
js还原逻辑
根据上面的关系,其实就可以写代码还原js了,我这里用了正则表达式
- 获取a数组的值
- 替换文件中所有的a1,a2…替换为b
- 根据b和a的关系,替换掉b数组下标为字符串
我还原后的js大体样子是这样的
是不是比之前好看了很多,虽然还是比较乱,但是可以看出大概的模样了,根据这个代码,就可以分析出sk的具体生成逻辑了,其实其中添加了大量的无效代码,只是为了看起来比较乱,最后看完代码,就可以分析出主要加密逻辑
最终sk生成算法逻辑
用户访问过程,先访问了
https://tak.jd.com/t/2D06E?_t=1611540055108
t是时间戳
这个2D06E根据自己抓包看看,据说隔一段时间会有变化
这个抓包自己分析下
会返回一个奇怪的json串,其实sk就是这个返回的json串中内容拼接成的
其中具体用哪些拼接而成,是根据@t这个变量来的,分为cca、cb、xa、ch、cbc、by、cza、ab 八种情况,每种都有不同的拼接方法
举个例子
返回值为
{
"code": "000000",
"message": "success",
"data": {
"@t": "xa",
"cNK": "voSrW8MUQ63MORUhYvua",
"W": "RZMK001CWc2ooIp1t09O",
"v": "K9PtpzoFhsOqSQtALVgm",
"Is": "QDA7QTqGAauhnvEu2AKl",
"XQw": "x0IljCbG561XC16U3tfR"
}
}
根据以上返回结合js中sk的算法
如果@t为xa时
取的是data中 第二个元素的下标为1~16位 + 第六个元素下标4~10位,注意下标从0开始
也就"voSrW8MUQ63MORUhYvua"的下标1~16 位 加上"x0IljCbG561XC16U3tfR"的4~10位组成如下
oSrW8MUQ63MORUhjCbG56
以上组成的值,就是提交订单生成的sk值的算法