張泳
摘 要 該文探討了Access2000密碼的加密方式,給出了破解Access2000密碼的一般方法,提出了防止被破解的對(duì)策,并對(duì)Access2000的安全性作了簡(jiǎn)要的評(píng)述。
關(guān)鍵詞 Access;加密;解密;數(shù)據(jù)庫(kù)安全
中圖分類號(hào):TP3 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1671-7597(2014)08-0072-02
當(dāng)前,Access 2000成為桌面型的主流數(shù)據(jù)庫(kù)系統(tǒng)。很多中小型應(yīng)用程序的數(shù)據(jù)庫(kù)都采用Access2000,筆者甚至發(fā)現(xiàn)很多共享軟件的數(shù)據(jù)庫(kù)都采用Access2000,這當(dāng)然與Access2000的簡(jiǎn)單易用等一系列優(yōu)點(diǎn)分不開。但我想提醒他們,別過(guò)分信任Access2000的安全性,Access2000的密碼并不安全。
網(wǎng)上有很多破解Access2000密碼的軟件,我們先來(lái)看看他們是如何破解Access2000密碼的,然后再探討如何避免別人破解自己的Access2000數(shù)據(jù)庫(kù)的密碼。
1 Access數(shù)據(jù)庫(kù)密碼的破解
要破解Access的密碼,必須清楚Access密碼的存放位置和加密方式。為此,我們按下面步驟做一個(gè)實(shí)驗(yàn):新建立一個(gè)數(shù)據(jù)庫(kù)db1.mdb,復(fù)制db1.mdb為db2.mdb,然后以獨(dú)占方式打開db2.mdb,設(shè)置db2.mdb數(shù)據(jù)庫(kù)的密碼為“01234567890123456789”(Access2000允許的密碼最長(zhǎng)為20位),這樣db2.mdb就包含了db1.mdb所沒(méi)有的密碼信息,我們用二進(jìn)制編輯器UltraEdit打開兩個(gè)數(shù)據(jù)庫(kù)文件,比較不同的地方:
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
……
可以看到,兩個(gè)數(shù)據(jù)庫(kù)文件從地址42H開始到69H,每隔一個(gè)字節(jié)出現(xiàn)不同,十分有規(guī)律,而且剛好是20個(gè)不同,我們可以猜想這20個(gè)地址存儲(chǔ)了密碼信息。因?yàn)閃indows中很多加密算法都采用與或運(yùn)算方式,下面我們?cè)囋嚥捎门c或運(yùn)算破解Access2000的密碼。我們分別拿出兩個(gè)文件對(duì)應(yīng)地址的數(shù)據(jù),如db1.mdb文件中42H對(duì)應(yīng)的數(shù)據(jù)為D0,而db2.mdb文件42H對(duì)應(yīng)的數(shù)據(jù)為E0,將D0和E0執(zhí)行與或運(yùn)算得到十六進(jìn)制數(shù)30(十進(jìn)制為48),剛好為密碼的第一個(gè)字符“0”的ASCII碼。進(jìn)一步實(shí)驗(yàn)可知:只要將兩個(gè)文件中的42H到69H地址中對(duì)應(yīng)的數(shù)據(jù)進(jìn)行與或運(yùn)算,就可以得到密碼“01234567890123456789”了。
以上破解過(guò)程,可以使用如下delphi代碼完成。
procedure TMainFrm.MethodActExecute(Sender: TObject);
var
C1,C2 : byte; i : integer;
Str : string; //str用來(lái)存儲(chǔ)破解所得的密碼
F1,F(xiàn)2 : file of byte; // F1為待破解的文件,F(xiàn)2為參照文件
// F1與F2文件的創(chuàng)建日期相同
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,則不需要進(jìn)行與或運(yùn)算
end;
closefile(F1); closefile(F2);
edtpwd.Text := str;
end;
我們?cè)僭囋囯p字節(jié)密碼的情況,將db1.mdb復(fù)制為db3.mdb,為db3.mdb設(shè)置20個(gè)漢字的中文密碼,比較db1.mdb和db3.mdb,發(fā)現(xiàn)從地址42H—69H共40個(gè)字節(jié)不同,這就說(shuō)明如果是雙字節(jié)密碼,密碼信息保存在42H到69H地址中,每?jī)蓚€(gè)地址對(duì)應(yīng)一個(gè)密碼字符。
進(jìn)一步比較空密碼數(shù)據(jù)庫(kù)42H—69H地址中存儲(chǔ)的數(shù)據(jù),發(fā)現(xiàn)只要數(shù)據(jù)庫(kù)創(chuàng)建日期相同,該地址存儲(chǔ)的數(shù)據(jù)就相同;創(chuàng)建日期不同,該地址的數(shù)據(jù)就會(huì)有些不同。至于數(shù)據(jù)庫(kù)創(chuàng)建日期與42H—69H地址中存儲(chǔ)的數(shù)值的關(guān)系,筆者暫不公布。另外,我們比較上面db1.mdb、db2.mdb、db3.mdb其他地址的數(shù)據(jù),也有些差異。這說(shuō)明,Access2000會(huì)利用用戶設(shè)定的密碼,對(duì)文件的其他數(shù)據(jù)進(jìn)行加密。據(jù)此推測(cè),如果把db2.mdb的42H到69H地址的數(shù)據(jù)換成空密碼文件db1.mdb對(duì)應(yīng)地址的數(shù)據(jù),并不能起到撤銷db2.mdb密碼的作用,這點(diǎn)大家可以自己實(shí)驗(yàn)證明。endprint
通過(guò)上面的實(shí)驗(yàn)我們總結(jié)出如下規(guī)律:Access2000中在地址42H到69H中保存密碼信息,如果密碼是單字節(jié)字符,則密碼信息主要保存在42H、44H、……、68H偶數(shù)地址中,加密方式是用戶所設(shè)密碼和相應(yīng)空密碼文件中42H、44H、……、68H地址所存儲(chǔ)的數(shù)據(jù)進(jìn)行與或運(yùn)算;空密碼文件42H——69H中存儲(chǔ)的數(shù)據(jù)與數(shù)據(jù)庫(kù)文件的創(chuàng)建日期有關(guān)。對(duì)于雙字節(jié)密碼情況有所不同,也復(fù)雜一些。
這表明,只要知道數(shù)據(jù)庫(kù)文件的創(chuàng)建日期,就能破解該數(shù)據(jù)庫(kù)文件的密碼。網(wǎng)上的破解Access密碼的工具大致是這樣的原理。
2 保護(hù)Access數(shù)據(jù)庫(kù)
知道了Access密碼破解的方法,我們看看如何防止別人破解自己Access數(shù)據(jù)庫(kù)密碼。
2.1 密碼設(shè)置為中文或其他雙字節(jié)字符
Access2000對(duì)雙字節(jié)密碼的處理比單字節(jié)密碼字符復(fù)雜,網(wǎng)上的破解Access2000密碼工具幾乎都只針對(duì)單字節(jié)密碼的情況,我試用了幾個(gè)這樣的工具,均不能破解中文字符的密碼。所以我們可以將Access的密碼設(shè)置為中文。如果我們使用Microsoft Office的 Access2000設(shè)置密碼時(shí),密碼輸入框一般是不允許輸入中文的,我們可以先在其他軟件如記事本中輸入中文字符,然后復(fù)制粘貼到Access2000的密碼輸入框,這樣就可以設(shè)置好中文密碼了。
2.2 隱藏?cái)?shù)據(jù)庫(kù)的創(chuàng)建日期
如前所述,數(shù)據(jù)庫(kù)的創(chuàng)建日期在整個(gè)破解過(guò)程中起著非常重要的作用,我們可以將數(shù)據(jù)庫(kù)的創(chuàng)建日期信息隱藏起來(lái)。
數(shù)據(jù)庫(kù)的創(chuàng)建日期由需要打開數(shù)據(jù)庫(kù)才能看到,一般情況下,這個(gè)日期和我們?cè)诓僮飨到y(tǒng)中查看文件屬性所看到的日期相同,我們可以進(jìn)行特殊處理,讓兩個(gè)日期不一樣,從而對(duì)破解起到很好的干擾作用。做法如下:
先將計(jì)算機(jī)的日期改為一個(gè)不容易被猜測(cè)的日期,如:2086-3-28,然后創(chuàng)建數(shù)據(jù)庫(kù)Data1.mdb,設(shè)置好密碼,保存;然后將日期改回當(dāng)前日期,將Data1.mdb復(fù)制為Data2.mdb,刪除Data1.mdb,Data2.mdb 就是我們所要使用的數(shù)據(jù)庫(kù)文件。這樣Data2內(nèi)部記錄的創(chuàng)建日期與Data1.mdb一樣,是2083-3-28,但如果在操作系統(tǒng)中查看文件屬性所看到的創(chuàng)建日期就是復(fù)制文件的日期,兩個(gè)日期不一樣,這樣就大大增加了破解的難度了。如果再配合第一種方法,效果會(huì)更好。
總的來(lái)說(shuō),Access2000作為桌面型數(shù)據(jù)庫(kù),密碼信息存放在單一文件中,且密碼與硬件無(wú)關(guān),加密算法也比較簡(jiǎn)單,所提供的安全保護(hù)很低,因此我們避免用Access2000存儲(chǔ)機(jī)密數(shù)據(jù)。如一定要使用Access保存機(jī)密數(shù)據(jù),可以采用如下方法:自己設(shè)計(jì)加密解密方法,數(shù)據(jù)先經(jīng)過(guò)加密再存到數(shù)據(jù)庫(kù)中;數(shù)據(jù)讀出來(lái)后先解密再使用。這樣別人即使能打開數(shù)據(jù)庫(kù)看到里面的數(shù)據(jù),也都是經(jīng)過(guò)加密的無(wú)意義的數(shù)據(jù)信息。
參考文獻(xiàn)
[1]丁小平.談Access 97數(shù)據(jù)庫(kù)密碼的破解[J].珠海國(guó)家仿真與控制工程技術(shù)研究中心.http://www.powerba.com/index.htm.
[2]馬文騫.防止Access 2000密碼被破譯的方法[J].http://software.szwindow.net.cn/.
[3]http://www.delphibbs.com.endprint