java模拟一个网站登录,用户名密码使用rsa加密。
1.需求,每天需要从不同的网站下不同的东西,需要你去写一个爬虫来搞。
2.执行。打开网站,输入用户名密码,登录,执行一系列操作
3.模拟登录,Java模拟登录我直接用httpclient,后面在用连接池
4.找到对方网站的publicKey
找对方的publicKey比较麻烦,
第一步,F12打开查看结构切到源代码,如下:

小弟前端不太熟悉,但是大概能猜出来,jquery一般都是什么什么组件。secuity下面有一个jsencrypt.min.js这个应该是rsa组件app.****.js应该就是编译后源代码
切换到网络

没有发现公钥或者私钥什么的点击Fetch/XHR只有一个请求,并没有找到需要的东西

那就只能看编译后的源代码:打开以后是这样子的有点懵逼,看到是webpack打包了。没找,硬着头皮找

先了解webpack的打包以后的结构:参考网站:贼详细
https://app.yinxiang.com/fx/970ae39c-9964-4aae-aa96-7e81fee4ef8f
从上面的网站了解到webpack的结构,那么就可以执行了,找到源代app.***.js,然后百度js格式化,我用的是:
https://tool.oschina.net/codeformat/js/
格式化以后,复制到文件中查看结构

找到如下代码以后,看页面的标签,并没有看到什么有用的标签或者什么东西,后来想到,有使用jsencrypt,来做加密,那么源码肯定有引用

找JSEncrypt,确定登录方法,开始找公钥或者私钥,看到下面代码
n.setPublicKey(o.constant.privateKey)

在做这个代码上面往上翻,看o是什么,是那个函数

那就开始找

找这个方法,找到一个敏感词汇:没想到居然有 privateKey的词汇。

找到这个公钥,开始加密,既然这个网站用的 JSEncrypt 那我也直接用,省事
然后在加密的时候发现有一行代码:
(0, s.sha256)(e.username + e.password)???还用了sha256?我淦
t.showLoading(), t.axios({
method: "post",
url: p.loginUrl,
headers: {
username: n.encrypt(e.username),
tenantId: e.tenantId,
appId: e.tenantId,
password: n.encrypt(e.password),
mac: n.encrypt((0, s.sha256)(e.username + e.password))
}
})...
继续做:s.sha256,然后看看s是什么,往上翻代码发现:
s = n("OQ+U"),

嗯哼,用的js-sha256,那么就直接用,完事测试

java代码:
@PostMapping("/encrypt")
public String getEncrypt( Encrypt encrypt){
boolean flag = false;
//创建HttpPost请求
HttpPost httpPost = new HttpPost("http://****/****/***/***");
httpPost.setHeader("Accept", HttpCommons.Accept);
httpPost.setHeader("User-Agent",HttpCommons.userAgent);
try {
httpPost.setHeader("****","****");
httpPost.setHeader("****","****");
httpPost.setHeader("****","****");
httpPost.setHeader("username",encrypt.getUsername());
httpPost.setHeader("password",encrypt.getPassword());
CloseableHttpResponse response = null;
//使用HttpClient发起请求
response = (CloseableHttpResponse) httpClient.execute(httpPost);
//判断响应状态码是否为200
if (response.getStatusLine().getStatusCode() == 200) {
//如果为200表示请求成功,获取返回数据
String content = EntityUtils.toString(response.getEntity(), "UTF-8");
HashMap hashMap = JSON.parseObject(content, HashMap.class);
if(hashMap.get("msg").equals("登录成功") && Integer.valueOf(hashMap.get("code").toString()) == 0){
System.out.println(content);
}else{
System.out.println(content);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return "ok";
}
测试结果

浙公网安备 33010602011771号