一:背景
- 在模拟登录某网站时遇到了用户名和密码被JS进行加密提交的问题,如图:
![这里写图片描述]()
二:解决方法
var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
function encodeInp(input) {
var output = "";
var chr1, chr2, chr3 = "";
var enc1, enc2, enc3, enc4 = "";
var i = 0;
do {
chr1 = input.charCodeAt(i++);
chr2 = input.charCodeAt(i++);
chr3 = input.charCodeAt(i++);
enc1 = chr1 >> 2;
enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
enc4 = chr3 & 63;
if (isNaN(chr2)) {
enc3 = enc4 = 64
} else if (isNaN(chr3)) {
enc4 = 64
}
output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2) + keyStr.charAt(enc3) + keyStr.charAt(enc4);
chr1 = chr2 = chr3 = "";
enc1 = enc2 = enc3 = enc4 = ""
} while (i < input.length);
return output
}
- 2.新建一个接口,内部实现和JS函数名相同的抽象方法:
public interface Methods {
public String encodeInp(String input);
}
- 3.Java执行JavaScript函数破解加密算法 ;
/**
* Java执行JavaScript脚本破解加密算法
* @param str
* @return 加密后的字符串
*/
public String playJs(String str) {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");
try {
String path = JsoupCookie.class.getResource("/").getPath().replaceAll("%20", " ");
engine.eval(new FileReader(path + "conwork.js"));
if (engine instanceof Invocable) {
Invocable invocable = (Invocable) engine;
Methods executeMethod = invocable.getInterface(Methods.class);
return executeMethod.encodeInp(str);
}
} catch (Exception e) {
}
return null;
}
注意:Js文件在实例中默认保存在项目源文件夹下
更多推荐:
Jsoup模拟登录带验证码的教务系统(原理详解)