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";
    }

 測試結果

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章