前几天整理资料,发现了一段小程序,是用来破解某软件用户密码的。回想一下,感慨很深。
先说一下计算原理。此软件允许业务主管控制主管部门和下属子公司的用户对软件的的使用权(添加、删除用户,修改密码,赋予用户各种操作权限,但无权访问用户数据)。如果知道了此软件的某一业务主管(非系统管理员,只是业务上具有高权限的用户)的密码,那么就可以查询该主管所管理的部门及所有下级子公司的用户名和加密后的密码内容。密码的加密并没有使用通用的MD5算法进行hash加密,而是使用了简单的字母替换方法。这样通过后面的小程序,根据加密后的密文就能迅速计算出密码明文。这样,破解者能轻而易举地得到此业务主管下辖的所有业务数据(通常以市为一个基本单位)。而业务主管如果知道了这种方法,则能查询下属用户的所有保密数据,这在制度上是绝对不允许的。
当然,这套系统并没有在Internet上,而只是在专用网上运行,所以很难从外部入侵。当然,业务主管安全意识较差,只是把密码设设成了简单的几位数字,使破解者得到了最破解密码的先决条件,如果密码设得复杂一些,那么就很难破解了。当然,这套系统的用户都是普通的操作员,基本上不可能计算出密码的算法。但是,我想说的是,难道软件的设计者把所有的安全性问题都寄托在用户的身上了么?希望所有的用户都具有安全专家一般的水平!希望整个系统从来不会进入入侵者!希望软件的使用者永远会循规蹈矩而不会窃取设置破坏其中数据!一个软件的安全体系,难道能架构在这些非技术性的东西上么?这就是我国软件业的真实平么?
这套耗资数千万元(可能上亿)的软件,由中国×学院(不明说了,免得告我诽谤,呵呵)和北京××软件公司(做过单机游戏,失败后转了型,大家可以猜猜看,非常有名的一个)设计,加密系统竟然如此简单。是水平不足?还是态度问题?我们的软件人,难道不应该反思么!米卢的那句话,太适合中国人了:态度决定一切!
不多说什么了,还是踏踏实实地走好自己的路吧。
附:破解源程序(简陋之极,请勿见笑)
Code
//用于××系统2003年××新程序,已知管理者密码,通过查询界面得到其他用户的加密密码后解密。
/*
加密原理:
首先输入一个数字密码,最高为8位,不足8位用空格补齐。
然后按一下方法换为字母:
1-A,2-D,3-I,4-空格,5-L,6-G,7-1,8-J,9-N,0-M,空格-K。
然后进行乱序排序,对应如下:
ABCDEFGH排序为
EDAGFCHB
至此明文加密完毕。
*/
//只适用于数字密码部分。
#include
void main()
{
char a,b,c,d,e,f,g,h;
char A,B,C,D,E,F,G,H;
void take_number(char x);
cout<<"请输入加密后的密码。每输入一位按空格,回车键结束输入。"
<
cin>>a>>b>>c>>d>>e>>f>>g>>h;
cout<< p="" />
//运算出原始的密码。
//第一步,返回排序前的序列状态。
A=c;B=h;C=f;D=b;E=a;F=e;G=d;H=g;
//第二步,将字母变为数字。即为原始密码。
take_number(A);
take_number(B);
take_number(C);
take_number(D);
take_number(E);
take_number(F);
take_number(G);
take_number(H);
//cout<<<<<<<<< p="" />
cout<<<"按任意键退出程序。"<< p="" />
return;
}
void take_number(char x)
{
if (x>96&&x<122) x=x-26;
{
if (x==´A´) cout<<1;
else if (x==´D´) cout<<2;
else if (x==´I´) cout<<3;
else if (x==´ ´) cout<<4;
else if (x==´L´) cout<<5;
else if (x==´G´) cout<<6;
else if (x==´1´) cout<<7;
else if (x==´J´) cout<<8;
else if (x==´N´) cout<<9;
else if (x==´M´) cout<<0;
else cout<<´ ´;
}
}