2022年5月25日超星登录加密算法分析
前言
2022年5月25日,超星修改了登录时的加密算法,导致助手登录过程中提示参数为空的问题,于是我就上超星研究了一下新的登录加密算法,结果
正文
首先先来到i.chaoxing.com这个地方,这里是超星登录的地方,所以我们的切入点就是这里,打开开发者工具可以看到如下图示
可以关注到有一个名为crypto-js.min.js的请求
这么明显的请求,那不用说,这次的加密修改肯定跟这个文件有关,接着我们去看一下登录的过程,看一下当点击登录按钮后,流程是怎么走的
右键登录按钮,检查元素,可以发现当登录按钮点击后,执行了一个js函数
那就全局搜索一下这个函数
可以看到有两条结果,我们只关注下面的结果,上面的结果点进去你会发现并没有什么卵用
我们关注一下下面login.js
可以看到login.js的第128行就是我们所关注的一整个函数,我们单独抽取出来分析
//手机号+密码登录
function loginByPhoneAndPwd(){
util.showMsg(false,"phoneMsg","",true);
util.showMsg(false,"pwdMsg","",true);
util.showMsg(false,"err-txt","");
var phone = $("#phone").val().trim();
var pwd = $("#pwd").val();
var fid = $("#fid").val();
var refer = $("#refer").val();
var forbidotherlogin = $("#forbidotherlogin").val();
if(util.isEmpty(phone)){
util.showMsg(true,"phoneMsg",please_input_phone,true);
return;
}/*else if(!util.isInterPhone(phone) && (phone.length > 50 || !util.checkEmail(phone))){
util.showMsg(true,"phoneMsg","手机号格式错误",true);
return;
}*/
if(util.isEmpty(pwd)){
util.showMsg(true,"pwdMsg",please_input_pwd,true);
return;
}
var t = $("#t").val();
if(t == "true"){
var transferKey = "u2oh6Vu^HWe40fj";
pwd = encryptByDES(pwd, transferKey);
//pwd = $.base64.btoa(pwd,"UTF-8");
}
if(capInstance == null || $("#needVcode").val() != "1"){
//容错
loginByPhoneAndPwdSubmit();
}else{
capInstance && capInstance.popUp();
}
}
我们可以关乎到有一段代码是跟密码加密是高度相关的
if(t == "true"){
var transferKey = "u2oh6Vu^HWe40fj";
pwd = encryptByDES(pwd, transferKey);
//pwd = $.base64.btoa(pwd,"UTF-8");
}
好,这里就是新的密码加密算法了
可以看到密码由原来的base64加密改为了DES对称加密
关注一下pwd = encryptByDES(pwd, transferKey);
这一行
我们继续搜索一下看能不能搜索到对应的加密方法
可以看到我们是能搜索到这个方法的
OK,我们进去看看加密过程,然后尝试能不能自己写一下出来
单独抽出来
function encryptByDES(message, key){
var keyHex = CryptoJS.enc.Utf8.parse(key);
var encrypted = CryptoJS.DES.encrypt(message, keyHex, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
return encrypted.ciphertext.toString();
}
那现在就很明显了,并没有哪里是难的,那我们接下来就尝试一下看能不能加密成功
首先我们要用CryptoJS的话,我们就需要从npm仓库拉取这个依赖
执行
npm i crypto-js
然后新建一个js文件,用于测试的,文件名随意
然后把CryptoJS引入
let CryptoJS = require("crypto-js");
接下来就可以把上面密码加密过程的方法全部复制粘贴下去,整体就是这样
let CryptoJS = require("crypto-js");
function encryptByDES(message, key) {
var keyHex = CryptoJS.enc.Utf8.parse(key);
var encrypted = CryptoJS.DES.encrypt(message, keyHex, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 });
return encrypted.ciphertext.toString();
}
接下来就可以测试一下这个方法了,怎么测试
回到刚才的登录方法
if (t == "true") {
var transferKey = "u2oh6Vu^HWe40fj";
pwd = encryptByDES(pwd, transferKey);
//pwd = $.base64.btoa(pwd,"UTF-8");
}
可以看到很明显了, encryptByDES(密码, transferKey)
到这里,我们拿123456来测试,所以我们最终的所有代码就是如下
let CryptoJS = require("crypto-js");
function encryptByDES(message, key) {
var keyHex = CryptoJS.enc.Utf8.parse(key);
var encrypted = CryptoJS.DES.encrypt(message, keyHex, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 });
return encrypted.ciphertext.toString();
}
console.log(encryptByDES("123456", "u2oh6Vu^HWe40fj"));
首先我们去超星那边看一看123456加密后是怎样的
可以看到123456加密后的结果是 218b246a6f42ee81
回到我们自己的代码,执行 node 你js文件的文件名
,例如我的js文件名是test,那就是 node test
可以看到我们的出来的结果是 218b246a6f42ee81
所以,我们得出如下最终结论
//官方加密结果:218b246a6f42ee81
//自己加密结果:218b246a6f42ee81
到这里,就可以证明我们的加密算法是没错的
本以为改了个多难的加密,没想到这么快就被逆向了
下班
版权声明:
作者:X1a0He
链接:https://www.x1a0he.com/cxnewloginsign
来源:X1a0He's Blog
文章版权归作者所有,未经允许请勿转载。
共有 0 条评论