如果你過分信任 Access 2000數(shù)據(jù)庫的密碼保護,你可能會因此而蒙受損失。這是因為Access 2000的數(shù)據(jù)庫級密碼并不安全,相反它很脆弱,甚至下面這段非常小的程序就可以攻破它:
程序一(VB6):Access 2000密碼破譯
Private Sub Command1_Click()
Const Offset = &H43 文件偏移地址:Access數(shù)據(jù)庫從此處開始存放加密密碼
Dim bEmpty(1 To 2) As Byte, bPass(1 To 2) As Byte
Dim i As Integer, Password As String
打開一個空數(shù)據(jù)庫作為參照
Open "D:\VB6_Test\MDB_Password\New_Empty_DB.mdb" For Binary As #1
打開被密碼保護的數(shù)據(jù)庫
Open "D:\VB6_Test\MDB_Password\Pass_Protected_DB.mdb" For Binary As #2
Seek #1, Offset
Seek #2, Offset
For i = 1 To 20 ' Access 2000 數(shù)據(jù)庫密碼最長允許20位
Get #1, , bEmpty ' 其中每位密碼占兩個字節(jié)
Get #2, , bPass ' 一個漢字也僅是一位密碼,占兩個字節(jié)
If (bEmpty(1) Xor bPass(1)) <> 0 Then
Password = Password + Chr(bEmpty(1) Xor bPass(1)) ' 將密碼解密
End If
Next
Close 1, 2
MsgBox "Password:" + Password ' 顯示密碼
End Sub
一、深入分析
上述程序成功的關(guān)鍵是使用了一個空數(shù)據(jù)庫(New_Empty_DB.mdb)。該數(shù)據(jù)庫的創(chuàng)建日期必須與被密碼保護的數(shù)據(jù)庫(Pass_Protected_DB.mdb)相一致。 換句話說,Access 2000 僅僅是使用“數(shù)據(jù)庫創(chuàng)建日期”來加密用戶密碼。
應(yīng)注意的是:上面的“創(chuàng)建日期”只是操作系統(tǒng)級的,也就是 Windows記錄在文件夾目錄里的信息(根據(jù)文件名的長短,每個文件在目錄里占用至少32個字節(jié),包括:文件名、屬性、文件大小、首蔟號、創(chuàng)建時間、修改時間和訪問時間等)。
Access 2000 在數(shù)據(jù)庫中也記錄了該數(shù)據(jù)庫的“創(chuàng)建日期”。加密數(shù)據(jù)庫密碼的正是數(shù)據(jù)庫內(nèi)部記錄的這個“創(chuàng)建日期”。該日期只有在數(shù)據(jù)庫被成功打開后才能看到。但在一般情況下,操作系統(tǒng)級的以及數(shù)據(jù)庫內(nèi)保存的“創(chuàng)建日期”是完全一樣的,因此這為破譯者提供了方便。
上述程序中還有一點需要說明:為簡明起見,解密密碼時僅處理了雙字節(jié)的首字節(jié),因此它僅對非漢字密碼有效。若要解密漢字密碼,須對雙字節(jié)均做處理。
程序一(VB6):Access 2000密碼破譯
Private Sub Command1_Click()
Const Offset = &H43 文件偏移地址:Access數(shù)據(jù)庫從此處開始存放加密密碼
Dim bEmpty(1 To 2) As Byte, bPass(1 To 2) As Byte
Dim i As Integer, Password As String
打開一個空數(shù)據(jù)庫作為參照
Open "D:\VB6_Test\MDB_Password\New_Empty_DB.mdb" For Binary As #1
打開被密碼保護的數(shù)據(jù)庫
Open "D:\VB6_Test\MDB_Password\Pass_Protected_DB.mdb" For Binary As #2
Seek #1, Offset
Seek #2, Offset
For i = 1 To 20 ' Access 2000 數(shù)據(jù)庫密碼最長允許20位
Get #1, , bEmpty ' 其中每位密碼占兩個字節(jié)
Get #2, , bPass ' 一個漢字也僅是一位密碼,占兩個字節(jié)
If (bEmpty(1) Xor bPass(1)) <> 0 Then
Password = Password + Chr(bEmpty(1) Xor bPass(1)) ' 將密碼解密
End If
Next
Close 1, 2
MsgBox "Password:" + Password ' 顯示密碼
End Sub
一、深入分析
上述程序成功的關(guān)鍵是使用了一個空數(shù)據(jù)庫(New_Empty_DB.mdb)。該數(shù)據(jù)庫的創(chuàng)建日期必須與被密碼保護的數(shù)據(jù)庫(Pass_Protected_DB.mdb)相一致。 換句話說,Access 2000 僅僅是使用“數(shù)據(jù)庫創(chuàng)建日期”來加密用戶密碼。
應(yīng)注意的是:上面的“創(chuàng)建日期”只是操作系統(tǒng)級的,也就是 Windows記錄在文件夾目錄里的信息(根據(jù)文件名的長短,每個文件在目錄里占用至少32個字節(jié),包括:文件名、屬性、文件大小、首蔟號、創(chuàng)建時間、修改時間和訪問時間等)。
Access 2000 在數(shù)據(jù)庫中也記錄了該數(shù)據(jù)庫的“創(chuàng)建日期”。加密數(shù)據(jù)庫密碼的正是數(shù)據(jù)庫內(nèi)部記錄的這個“創(chuàng)建日期”。該日期只有在數(shù)據(jù)庫被成功打開后才能看到。但在一般情況下,操作系統(tǒng)級的以及數(shù)據(jù)庫內(nèi)保存的“創(chuàng)建日期”是完全一樣的,因此這為破譯者提供了方便。
上述程序中還有一點需要說明:為簡明起見,解密密碼時僅處理了雙字節(jié)的首字節(jié),因此它僅對非漢字密碼有效。若要解密漢字密碼,須對雙字節(jié)均做處理。