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