張泳
摘 要 該文探討了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