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"; }
测试结果