遇见问题:写爬虫抓取电信数据,在登陆时发现密码加密问题,扒出加密函数如下:
$.fn.aesEncrypt = function (n) {
var t = CryptoJS.MD5("login.189.cn"),
i = CryptoJS.enc.Utf8.parse(t),
r = CryptoJS.enc.Utf8.parse("1234567812345678"),
u = CryptoJS.AES.encrypt(n, i, {iv: r });
return u + ""
};
解决办法:使用java自带执行js脚本的引擎,执行js脚本即可。代码如下:
aes.js
var aesEncrypt = function (password) {
var t = CryptoJS.MD5("login.189.cn"),
i = CryptoJS.enc.Utf8.parse(t),
r = CryptoJS.enc.Utf8.parse("1234567812345678"),
u = CryptoJS.AES.encrypt(password, i, {iv: r});
return u + ""
};
CryptoJsUtil.java
public class CryptoJsUtil {
private volatile static CryptoJsUtil cryptoJsUtil ;
private CryptoJsUtil() {}
private static synchronized void syncInit() {
if (cryptoJsUtil == null) {
cryptoJsUtil = new CryptoJsUtil();
}
}
public static CryptoJsUtil getInstance() {
if(cryptoJsUtil == null){
syncInit();
}
return cryptoJsUtil;
}
/**
* 加密电信密码
* @param pwd 服务密码
* @return 密文
*/
public String encryptByAes(String pwd){
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
String result ;
try{
String resourcePath = CryptoJsUtil.class.getClassLoader().getResource("").getPath();
System.out.println(resourcePath);
engine.eval(new FileReader(resourcePath+"static/js/crypto-js.js"));
engine.eval(new FileReader(resourcePath+"static/js/dxAes.js"));
Invocable invocable = (Invocable) engine;
result = (String)invocable.invokeFunction("aesEncrypt", pwd);
}catch (Exception e){
throw new RuntimeException("CryptoJs 加密失败:"+e.getMessage());
}
return result ;
}
}
CryptoJsUtilTest.java
public class CryptoJsUtilTest {
@Test
public void testEncryptByAes(){
//电信服务密码加密
System.out.println(CryptoJsUtil.getInstance().encryptByAes("989977"));
}
}
还要引用两个js文件:cipher-core.js、crypto-js.js
从ITeye换博客,第一篇文章,希望对大家有帮助!http://see-you-again.iteye.com/