我认为学习通存在很大的问题。
按照业内常用方法,密码一般使用哈希加密后传输,这样即使遭到中间人攻击,也能保护密码不被泄露。
但是,学习通并不是这样。
通过对浏览器对网络请求的追踪,可以发现登录请求使用POST方式发送到https://passport2.chaoxing.com/fanyalogin。而且看上去好像确实加密了。
可以见到123456被加密为218b246a6f42ee81
通过检查发起程序,我们可以确认请求是谁发起的。
发起程序是login.js
在对login.js进行检查后,发现了令人震惊的一幕。
将整个函数放上来:
//手机号+密码登录
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);//这里直接使用可以被还原的DES进行加密
//pwd = $.base64.btoa(pwd,"UTF-8");
}
if(capInstance == null || $("#needVcode").val() != "1"){
//容错
loginByPhoneAndPwdSubmit();
}else{
capInstance && capInstance.popUp();
}
不难看出,该程序并非通过哈希进行加密,而是使用可以解密的DES算法进行加密。
DES的详细参数见下图:
http://tool.chacuo.net/cryptdes
但是,就算这样,如果按照常理,transferKey是由服务器随机生成的,一般也难以泄露。
那么,为什么会这样?
可见这个transferKey完全是硬编码在js中的
这个transferKey根本就是一个硬编码的固定值嘛。这样一来就有了多种可能:
1.数据库也是用transferKey加密的,因此在暴露后遭到破解。
2.数据库是明文存储的。
3.学习通优化技术过差,让密码先从明文变为DES密文,在从DES密文解密为明文,最后进行哈希再与数据库比对。
3.学习通优化技术过差,让密码先从明文变为DES密文,使用DES密文进行哈希再与数据库比对。
具体怎么样就见仁见智了。
22日12:21更新
[BUG反馈]前端密码加密更改 · Issue #116 · Samueli924/chaoxing通过对GitHub上超星相关的内容进行检索,可以确定这种奇怪的方法实际上并不是一开始就是这样,而是在26天之前进行的修改。此前采用的加密方式是现在被注释掉的base64加密。
目前尚不明确超星修改这个的目的。或许是想和自动机器人对抗?不过这样的修改显然达不到那样的目的。 |