文章目录
- 一、简介
- JS加密的分析步骤:
- 二、案例:有道翻译
- 步骤一:常规操作。找到url,简单分析
- 步骤二:更改参数为变量,找到参数变化规律
- 步骤三:(关键一步)使用Python代码生成sign
一、简介
“加密”的过程,就是把“明文”变成“密文”的过程。反之:“解密”的过程,就是把“密文” 变为“明文”。网页数据加密的方式有很多种,比如:JS 加密、Base64 加密、CSS 加密等。
下面让我们一起来探讨一下JS加密!并借助于案例感受解密思维逻辑。
JS加密:是一个非常常见的加密,大部分的页面都会存在
JS加密一般都是对参数进行加密(比如:salt、sign、token、signature等)
JS加密的分析步骤:
- 找到哪些参数在影响数据的获取?
需要做不同的请求,对比参数,找出不同的参数即可 - 找到参数之后,需要查找这些参数从哪里获得的/生成的原理是什么?
(1) 这些参数可能是通过之前的一些请求传递过来的
(2) 参数是在某个JS文件中生成的 —> 找出对应的JS文件,分析JS代码,得到参数生成的原理
二、案例:有道翻译
需求:用户输入,得到翻译
步骤一:常规操作。找到url,简单分析


代码:
import time,random
import requests,hashlib
# 定义请求头
headers = {
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Connection': 'keep-alive',
'Content-Length': '236',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Cookie': 'OUTFOX_SEARCH_USER_ID=986208581@10.108.160.102; JSESSIONID=aaaLdHZ6LoWe0bYE2Fiyx; OUTFOX_SEARCH_USER_ID_NCOO=1300305255.7828863; SESSION_FROM_COOKIE=unknown; ___rl__test__cookies=1606460419940',
'Host': 'fanyi.youdao.com',
'Origin': 'http://fanyi.youdao.com',
'Referer': 'http://fanyi.youdao.com/',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest',
}
# 自定义输入单词
word = input('请输入想要查询的单词:')
# 定义参数字典
data = {
'i': as,
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': '16068273407898',
'sign': 'c33d66c41999155f58283feceaf151dd',
'lts': '1606827340789',
'bv': '1dfc4dfa8627abec379e26d41735b09a',
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTlME',
}
# 发起请求,接收响应
response = requests.post(url='http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule',headers=headers,data=data)
print(response.json()['translateResult'][0][0]['tgt'])发现问题:
单词只能查询as,其余单词的都不行


分析问题:可能是参数不同,到页面上查看其它单词的参数。
分析得到:

不同单词有不同的参数:
- i:输入的单词
- salt:可能是时间戳
- sign:看不懂
- lts:可能是时间戳,但比salt少一位
步骤二:更改参数为变量,找到参数变化规律
此时判定为使用了JS加密,故去网页中的JS文件查找

通过开发者工具的Initiator可以发现,当前文件仅仅使用了一个JS文件,所以我们要找的参数就在其中。点击查看js文件通过查找,发现sign所在的位置及代码

如何确定这个sign就是我们需要的?
在这一行打上断点,刷新页面重新请求,如进入debug模式则为目标参数

找到目标参数,分析代码
var r = function(e) {
var t = n.md5(navigator.appVersion)
, r = "" + (new Date).getTime()
, i = r + parseInt(10 * Math.random(), 10);
return {
ts: r,
bv: t,
salt: i,
sign: n.md5("fanyideskweb" + e + i + "]BjuETDhU)zqSxf-=B#7m")
}
};分析结果:
sign是经过md5加密后的值,加密参数有e,i两个
其中e可以发现是我们输入的单词
i也就是salt,是由r一级一位随机数组成,其中的r是时间戳。
步骤三:(关键一步)使用Python代码生成sign
salt = str(int(round(time.time()*1000))) + str(random.randint(0,9))
# 获取sign
def get_sign(sign):
# 1. 初始化md5
md5 = hashlib.md5()
# 2. 加密
md5.update(sign.encode('utf-8'))
# 3. 返回加密数据
return md5.hexdigest()
sign = get_sign("fanyideskweb" + word + salt + "]BjuETDhU)zqSxf-=B#7m")步骤四:更改参数字典,完成需求
# 定义参数字典
data = {
'i': word,
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': salt,
'sign': sign,
'lts': str(int(round(time.time()*1000))),
'bv': '1dfc4dfa8627abec379e26d41735b09a',
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTlME',
}
















