Access2000密码的破解与防范
2014-07-24张泳
张泳
摘 要 该文探讨了Access2000密码的加密方式,给出了破解Access2000密码的一般方法,提出了防止被破解的对策,并对Access2000的安全性作了简要的评述。
关键词 Access;加密;解密;数据库安全
中图分类号:TP3 文献标识码:A 文章编号:1671-7597(2014)08-0072-02
当前,Access 2000成为桌面型的主流数据库系统。很多中小型应用程序的数据库都采用Access2000,笔者甚至发现很多共享软件的数据库都采用Access2000,这当然与Access2000的简单易用等一系列优点分不开。但我想提醒他们,别过分信任Access2000的安全性,Access2000的密码并不安全。
网上有很多破解Access2000密码的软件,我们先来看看他们是如何破解Access2000密码的,然后再探讨如何避免别人破解自己的Access2000数据库的密码。
1 Access数据库密码的破解
要破解Access的密码,必须清楚Access密码的存放位置和加密方式。为此,我们按下面步骤做一个实验:新建立一个数据库db1.mdb,复制db1.mdb为db2.mdb,然后以独占方式打开db2.mdb,设置db2.mdb数据库的密码为“01234567890123456789”(Access2000允许的密码最长为20位),这样db2.mdb就包含了db1.mdb所没有的密码信息,我们用二进制编辑器UltraEdit打开两个数据库文件,比较不同的地方:
db1.mdb:
……
40H-4FH: BC 4E D0 6F EC 37 0B D0 9C FA 90 CA 28 E6 45 22
50H-5FH: 8A 60 02 00 7B 36 A3 E6 DF B1 21 60 13 43 99 3B
60H-6FH: B1 33 62 F5 79 5B C4 21 7C 2A 6A FA 7C 99 05 13
……
db2.mdb
……
40H-50H: BC 4E E0 6F DD 37 39 D0 AF FA A4 CA 1D E6 73 22
50H-60H: BD 60 3A 00 42 36 93 E6 EE B1 13 60 20 43 AD 3B
60H-70H: 84 33 54 F5 4E 5B FC 21 45 2A 6A FA 7C 99 05 13
……
可以看到,两个数据库文件从地址42H开始到69H,每隔一个字节出现不同,十分有规律,而且刚好是20个不同,我们可以猜想这20个地址存储了密码信息。因为Windows中很多加密算法都采用与或运算方式,下面我们试试采用与或运算破解Access2000的密码。我们分别拿出两个文件对应地址的数据,如db1.mdb文件中42H对应的数据为D0,而db2.mdb文件42H对应的数据为E0,将D0和E0执行与或运算得到十六进制数30(十进制为48),刚好为密码的第一个字符“0”的ASCII码。进一步实验可知:只要将两个文件中的42H到69H地址中对应的数据进行与或运算,就可以得到密码“01234567890123456789”了。
以上破解过程,可以使用如下delphi代码完成。
procedure TMainFrm.MethodActExecute(Sender: TObject);
var
C1,C2 : byte; i : integer;
Str : string; //str用来存储破解所得的密码
F1,F2 : file of byte; // F1为待破解的文件,F2为参照文件
// F1与F2文件的创建日期相同
begin
assignfile(F1,edtF1path.text); // edtF1path.text为F1的路径
reset(F1);
assignfile(F2,edtF2path.text); // edtF1path.text为F2的路径
reset(F2);
seek(F1,$42); seek(F2,$42); // 从地址42H开始
for i := 1 to 40 DO
begin read(F1,C1); read(F2,C2);
if C1<>C2 then str := str + chr(C1 xor C2);
//如果C1=C2,则不需要进行与或运算
end;
closefile(F1); closefile(F2);
edtpwd.Text := str;
end;
我们再试试双字节密码的情况,将db1.mdb复制为db3.mdb,为db3.mdb设置20个汉字的中文密码,比较db1.mdb和db3.mdb,发现从地址42H—69H共40个字节不同,这就说明如果是双字节密码,密码信息保存在42H到69H地址中,每两个地址对应一个密码字符。
进一步比较空密码数据库42H—69H地址中存储的数据,发现只要数据库创建日期相同,该地址存储的数据就相同;创建日期不同,该地址的数据就会有些不同。至于数据库创建日期与42H—69H地址中存储的数值的关系,笔者暂不公布。另外,我们比较上面db1.mdb、db2.mdb、db3.mdb其他地址的数据,也有些差异。这说明,Access2000会利用用户设定的密码,对文件的其他数据进行加密。据此推测,如果把db2.mdb的42H到69H地址的数据换成空密码文件db1.mdb对应地址的数据,并不能起到撤销db2.mdb密码的作用,这点大家可以自己实验证明。endprint
通过上面的实验我们总结出如下规律:Access2000中在地址42H到69H中保存密码信息,如果密码是单字节字符,则密码信息主要保存在42H、44H、……、68H偶数地址中,加密方式是用户所设密码和相应空密码文件中42H、44H、……、68H地址所存储的数据进行与或运算;空密码文件42H——69H中存储的数据与数据库文件的创建日期有关。对于双字节密码情况有所不同,也复杂一些。
这表明,只要知道数据库文件的创建日期,就能破解该数据库文件的密码。网上的破解Access密码的工具大致是这样的原理。
2 保护Access数据库
知道了Access密码破解的方法,我们看看如何防止别人破解自己Access数据库密码。
2.1 密码设置为中文或其他双字节字符
Access2000对双字节密码的处理比单字节密码字符复杂,网上的破解Access2000密码工具几乎都只针对单字节密码的情况,我试用了几个这样的工具,均不能破解中文字符的密码。所以我们可以将Access的密码设置为中文。如果我们使用Microsoft Office的 Access2000设置密码时,密码输入框一般是不允许输入中文的,我们可以先在其他软件如记事本中输入中文字符,然后复制粘贴到Access2000的密码输入框,这样就可以设置好中文密码了。
2.2 隐藏数据库的创建日期
如前所述,数据库的创建日期在整个破解过程中起着非常重要的作用,我们可以将数据库的创建日期信息隐藏起来。
数据库的创建日期由需要打开数据库才能看到,一般情况下,这个日期和我们在操作系统中查看文件属性所看到的日期相同,我们可以进行特殊处理,让两个日期不一样,从而对破解起到很好的干扰作用。做法如下:
先将计算机的日期改为一个不容易被猜测的日期,如:2086-3-28,然后创建数据库Data1.mdb,设置好密码,保存;然后将日期改回当前日期,将Data1.mdb复制为Data2.mdb,删除Data1.mdb,Data2.mdb 就是我们所要使用的数据库文件。这样Data2内部记录的创建日期与Data1.mdb一样,是2083-3-28,但如果在操作系统中查看文件属性所看到的创建日期就是复制文件的日期,两个日期不一样,这样就大大增加了破解的难度了。如果再配合第一种方法,效果会更好。
总的来说,Access2000作为桌面型数据库,密码信息存放在单一文件中,且密码与硬件无关,加密算法也比较简单,所提供的安全保护很低,因此我们避免用Access2000存储机密数据。如一定要使用Access保存机密数据,可以采用如下方法:自己设计加密解密方法,数据先经过加密再存到数据库中;数据读出来后先解密再使用。这样别人即使能打开数据库看到里面的数据,也都是经过加密的无意义的数据信息。
参考文献
[1]丁小平.谈Access 97数据库密码的破解[J].珠海国家仿真与控制工程技术研究中心.http://www.powerba.com/index.htm.
[2]马文骞.防止Access 2000密码被破译的方法[J].http://software.szwindow.net.cn/.
[3]http://www.delphibbs.com.endprint