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
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>