模擬登陸請求的時候遇到網站對用戶輸入密碼在js裏面加密後提交 的解決方案

 

1:如果他們的加密過程沒有隨機token的處理的話, 可以直接在我們後臺代碼寫死(因爲一個密碼生成的密文是固定的)

2:加密過程有隨機token的加入.以

目前的理解,解決方法有兩種. 

1): 找到加密的js文件,或者js代碼. 然後在自己的後臺用java代碼將js的邏輯重寫一遍

當時的想法就是這樣的.  這種寫法比較複雜, js和java的語法大致相似. 符號意義和變量定義也比較容易轉變. 開發過程中遇到的複雜點在於js中的數組和java的數組的轉換. js中的數組長度不固定,不用指定儲存的類型. 導致在java代碼中根據具體一直需要新建長度更大的數組去取代老數組. 老數組的內容也要複製進新數組. 

重寫加測通用了2個小時左右

 

2): 找到加密的js文件或加密內容.將js文件複製到項目目錄. 然後再java後臺執行讀取js函數.  這樣就舒服多了 

public class Md5JsUtil {

	 public String hex_md5(String paramString){  
	    String str1 = paramString;
	    ScriptEngine localObject = new ScriptEngineManager().getEngineByName("javascript");
	    String str2 =  ".../util/md5.js";//項目js路徑
	     
	    InputStream localInputStream  = getClass().getClassLoader().getResourceAsStream(str2);
	    String js_content = "" ; 
	    try{    
			byte b[] = new byte[1024];
			int j = 0;
			while ((j = localInputStream.read(b)) != -1) {

				js_content = js_content + new String(b, 0, j, "UTF-8");

			} 
	    	
	      localObject.eval( js_content );
	      if ((localObject instanceof Invocable)) {
	    	  
	    	  str1 =   String.valueOf(((Invocable) localObject).invokeFunction("hex_md5", new Object[] { paramString })); //方法名和參數
	    	  

	      }
	    }catch (FileNotFoundException localFileNotFoundException){
	      try{
	        localInputStream.close();
	      } catch (IOException localIOException1){
	    	  localIOException1.printStackTrace();
	      }
	    }catch (ScriptException localScriptException){
	      try {
	        localInputStream.close();
	      } catch (IOException localIOException2) {
	    	  localIOException2.printStackTrace();
	      }
	    } catch (IOException localIOException3) {
	    	
	      try {
	        localInputStream.close();
	      } catch (IOException localIOException4)
	      {
	    	  localIOException4.printStackTrace();
	      }
	    }
	    catch (NoSuchMethodException localNoSuchMethodException)
	    {
	      try
	      {
	        localInputStream.close();
	      }
	      catch (IOException localIOException5)
	      {
	    	  localIOException5.printStackTrace();
	      }
	    }
	    finally
	    {
	      try
	      {
	        localInputStream.close();
	      }
	      catch (IOException localIOException6)
	      {
	    	  localIOException6.printStackTrace();
	      }
	    }
	    return str1;
	  }
	 

 

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