最近因为学校换了新的教务系统,想做一个模拟登陆功能,发现登陆的账号和密码有一个js脚本来进行加密
整理了一下java中执行JS的方法
智强教务 账号 密码 加密方法
var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";functionencodeInp(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
}
Java
首先需要创建一个接口,接口中的抽象方法要和js中函数名保持一致
public interfaceMethods {publicString encodeInp(String input);
}
然后在主函数中使用ScriptEngineManager来加载js
ScriptEngineManager manager = newScriptEngineManager();
ScriptEngine engine= manager.getEngineByName("javascript");
FileReader fileReader=new FileReader("F:\\JAVAProject\\src\\conwork.js");//js路径
engine.eval(fileReader);if (engine instanceofInvocable) {
Invocable invocable=(Invocable) engine;
Methods executeMethod= invocable.getInterface(Methods.class);
System.out.println(executeMethod.encodeInp("account"));
System.out.println(executeMethod.encodeInp("password"));
}
Android
由于安卓中没有ScriptEngineManager ,引入jar包后也无法使用(囧)
故使用J2V8这个第三方库来进行加载
implementation ‘com.eclipsesource.j2v8:j2v8:[email protected]
将js文件放在assets文件夹下
然后在Activity中调用
publicString encodeNumber()
{
String result="没有";
InputStream is= null; //获取用户名与密码加密的js代码
try{
is= getAssets().open("conwork.js");
}catch(IOException e) {
e.printStackTrace();
}
BufferedReader reader= new BufferedReader(newInputStreamReader(is));
StringBuilder sb= newStringBuilder();
String line= null;try{while ((line = reader.readLine()) != null) {
sb.append(line);
}
V8 runtime= V8.createV8Runtime(); //使用J2V8运行js代码并将编码结果返回
final String encodename =runtime.executeStringScript(sb.toString()+ "encodeInp(‘account‘);\n");final String encodepwd=runtime.executeStringScript(sb.toString()+"encodeInp(password‘);\n");
runtime.release();
result=encodename+"%%%"+encodepwd;
}catch(IOException e) {
e.printStackTrace();
}finally{try{
is.close();
}catch(IOException e) {
e.printStackTrace();
}
}returnresult;
}
原文:https://www.cnblogs.com/robotpaul/p/11165783.html