这次遇到的登陆加密着实费了些功夫,我都想着用phantomjs来解决登陆然后拿到cookies了,这次使用了fiddler抓包了
首先登陆时发现密码加密了,还多了些参数:
在fiddler全局搜索guid,发现是上一个请求里的:
接着找密码加密的部分:
一般来说加密部分都在自己写的js里,所以就不看jquery开头的部分,点击VM919.formatted:74:
找到了加密的部分,我这是使用了断掉调试,可以看到方法所在的行,点击跳转到1496行:
可以发现使用了generateKeypairNoLogin?random的响应数据,可以看出是rsa加密,然后在转为python代码进行加密,参看文章Python从二进制文件中提取Exponent和Modulus数据(e, n)并构建公钥,
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization
import base64
from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5
from Crypto.PublicKey import RSA
def get_public_key(n, e):
n = int(n, 16)
e = int('0x%s' % e, 16)
# 使用(e, n)初始化RSAPublicNumbers,并通过public_key方法得到公钥
pub_key = rsa.RSAPublicNumbers(e, n).public_key(default_backend())
# 将公钥编码为PEM格式的数据
pem = pub_key.public_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PublicFormat.SubjectPublicKeyInfo
)
return pem
if __name__ == '__main__':
n = 'B7697595490C863FA5A1575F489EF551DCA5EDEC757D92E392B6E0474E369B86B24A81567E0FADFFF966BAAE0F993D8F76F598DD26B05D3B7D2645793A358B61D218C3D9915CA60A32F0F7F5CF80BC716DB70A36A5492B45E037822ED1794F1475BEB3E4C6E6115694B5765E47BA951423864A2F34B18B2F547933B050E08343'
e = '010001'
public_key = populate_public_key(n, e)
rsakey = RSA.importKey(public_key)
cipher = Cipher_pkcs1_v1_5.new(rsakey)
ps = cipher.encrypt('zycplasf00').encode('hex')
print ps
因为常见的rsa加密后是base64编码后的
lr+JhGqViYzxlQf21y66Hfbv9NV5q6IA/jet6Znb8OgpOLIt44njukgvtaAIpHXwYtxcnFEvCecONQI42z4yumtsgDdF1FupzATJOctohGsF9RW5TAlBGkkGD80ePelaS0XUwbT42NfhB9RHED1IN5YCIHXrxUEE/ZGST9OiscM=
形式的,而非这个系统登录时传的
299f41efe33de3377e6a2895d725b4cec8f44e447fe727b0315f4094a9a2adef5dfd5d3aabe3c54e010a95e6722d64f358a9a12dcf1ffc5dc840f428ccd8acfcbb69982fb6c6f4be599b2dd433cbd71500693851918f6b13262e7b5d236ddbe71494a7988975c69f9e3c5e3a59e1b9dfb760007ecc7e2764c6e93568dbdce443
所以在最后直接编码为hex,至此密码加密部分完成,登录就不写了