教务系统模拟登陆
模拟登陆
- start_url是登陆页面,请求后可以得到csrftoken,如果不想被发现可以添加时间戳
- 需要向服务器请求RSA公钥,对密码进行加密,但是每一个公钥加密的结果是不一样的,同时还要把公钥放在session上才能够验证密码通过
- post表单中有两个mm值目的是防止浏览器自动填充密码
使用python3 加密mm值
- 先得到moudles、exponent,在使用RSA加密发送
- login.js的源码,在网页的plugin文件中有加密算法
//获取加密参数
var modulus,exponent;
//Ajax请求
$.getJSON(_path+"/xtgl/login_getPublicKey.html?time="+new Date().getTime(),function(data){
modulus = data["modulus"];
exponent = data["exponent"];
});
//加密密码
var rsaKey = new RSAKey();
rsaKey.setPublic(b64tohex(modulus), b64tohex(exponent));
var enPassword = hex2b64(rsaKey.encrypt($("#mm").val()));
$("#mm").val(enPassword);
$("#hidMm").val(enPassword); //页面上放了一个隐藏的password类型输入框,name也是mm,防止密码自动填充,在提交的时候把内容设置成跟输入的密码一致
- 使用Python3编写hex2b64()、b64tohex()两个函数,将网页传来的base64数据(modulus、exponent)转为hex,将rsa函数得到的密文转换为base64
import rsa
# 具体的算法我也不会
def hex2b64(hex):
def b64tohex(b64):
# rsa加密——先通过m,e生成公钥,再通过公钥加密pwd
def encrypt_pwd(modulus,exponent,pwd):
rsa_key = rsa.PubliceKey(b64tohex(modulus),b64tohex(exponent))
rsa_mm = ras.encrypt(pwd,rsa_key)
return hex2b64(rsa_mm)
"""大致逻辑就是这样,但是还需要对数据进行一些处理才用于生成公钥"""
- 后续就可以通过requests和bs4处理,继承登录模块的cookie即可访问网页数据
- 具体的代码在GitHub - yangp1205/zf_jwxt: 登陆RSA加密密码的正方教务系统上
- RSA加密通过网页的js脚本生成,在python3中的算法感谢EddieIvan01的分享
网友评论