故事背景:
在获取某网站接口数据时,发现其请求的 headers 中的参数 使用了 AES算法加密 ,并对其进行校验,在此简单记录下自己的踩坑历程。
AES简介:
高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法。对称加密算法也就是加密和解密用相同的密钥。
AES加密方式有五种:ECB, CBC, CTR, CFB, OFB
CBC:加密需要一个十六位的key(密钥)和一个十六位iv(偏移量)
ECB:加密不需要iv
AES,CBC: 加密的python实现
AES 加密的参数
AES 加密主要有以下几个参数(坑):
key:加密的时候用秘钥,解密的时候需要同样的秘钥才能解出来。
word:需要加密的参数。
model:aes 加密常用的有 ECB 和 CBC 模式
iv:偏移量 ,这个参数在 ECB 模式下不需要,在 CBC 模式下需要。
参数条件:
key:必须是16位字节或者24位字节或者32位字节
word:字节长度需要是16位的倍数
python 模块安装:
**Windows** :pycryptodome 模块: pip install pycryptodome
**Linux** pycrypto模块 : pip install pycrypto
现在开始进入正题
找到目标接口,查看他的请求头 你会发现它里面的 参数: authorization 是被加密的,
经过测试的出,此参数的值是一次性的,不能被二次使用
拒绝请求:不对接口返回:未授权,二次使用返回:签名已失效
全局搜索 authorization
进入第一个js文件查找可能存在的加密段落,打上断点顺藤摸瓜找到加密的地方
根据断点查到的信息可以 authorization 是由 Object(kt.d)(a, "WTAHAPPYACTIVITY") 方法生成的
a 变量中 就只有一个 n 变量,根据断点显示出来的结果可以看得出 n 为 时间戳, 那么现在就进入Object(kt.d)看看
可以看得出 E 函数 就是加密的核心代码: 为 AES加密 + ECB 模式 + Pkcs7, e为key密钥, 知道了这些 我们就可以通过
python 的Crypto模块将其加密模拟出来了,经历千辛万苦,终于还原了加密方式,并且能超过的访问该接口拿到数据了,
话不多说,直接上代码