如何防止Access 2000密碼被破_Access數據庫教程

      編輯Tag賺U幣
      教程Tag:暫無Tag,歡迎添加,賺取U幣!

      推薦:如何用Access 輕松打造花店訂單系統
      任務名稱:打造花店訂單系統 任務描述:小特的MM開了一家花店,生意特別火,招了三個小工還有點忙不過來。每天都有不少人通過電話或直接到花店訂購鮮花,大多數客戶還希望能在指定時間將所購鮮花送到指定地點。小特便用Access幫MM定制了一個花店訂單系統:通過這

      如果你過分信任 Access 2000數據庫的密碼保護,你可能會因此而蒙受損失。這是因為Access 2000的數據庫級密碼并不安全,相反它很脆弱,甚至下面這段非常小的程序就可以攻破它:

      程序一(VB6):Access 2000密碼破譯
      Private Sub Command1_Click()
      Const Offset = &H43 文件偏移地址:Access數據庫從此處開始存放加密密碼
      Dim bEmpty(1 To 2) As Byte, bPass(1 To 2) As Byte
      Dim i As Integer, Password As String
      打開一個空數據庫作為參照
      Open "D:\VB6_Test\MDB_Password\New_Empty_DB.mdb" For Binary As #1
      打開被密碼保護的數據庫
      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 數據庫密碼最長允許20位
      Get #1, , bEmpty ' 其中每位密碼占兩個字節
      Get #2, , bPass ' 一個漢字也僅是一位密碼,占兩個字節
      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


      一、深入分析
      上述程序成功的關鍵是使用了一個空數據庫(New_Empty_DB.mdb)。該數據庫的創建日期必須與被密碼保護的數據庫(Pass_Protected_DB.mdb)相一致。 換句話說,Access 2000 僅僅是使用“數據庫創建日期”來加密用戶密碼。


      應注意的是:上面的“創建日期”只是操作系統級的,也就是 Windows記錄在文件夾目錄里的信息(根據文件名的長短,每個文件在目錄里占用至少32個字節,包括:文件名、屬性、文件大小、首蔟號、創建時間、修改時間和訪問時間等)。
      Access 2000 在數據庫中也記錄了該數據庫的“創建日期”。加密數據庫密碼的正是數據庫內部記錄的這個“創建日期”。該日期只有在數據庫被成功打開后才能看到。但在一般情況下,操作系統級的以及數據庫內保存的“創建日期”是完全一樣的,因此這為破譯者提供了方便。
      上述程序中還有一點需要說明:為簡明起見,解密密碼時僅處理了雙字節的首字節,因此它僅對非漢字密碼有效。若要解密漢字密碼,須對雙字節均做處理。
      二、防范措施
      1、隱藏“創建日期”
      從上面的分析可以看出,既然“創建日期”是破譯的關鍵,那么我們應“對癥下藥”,將真實的“創建日期”隱藏起來。
      第一步,創建數據庫時,使用一個“不可思議的、別人不易猜測”的日期。做法為:修改 Windows系統日期,例如改為2026年05月15日,創建數據庫后再將系統日期改回。這個“不可思議”的日期即為該數據庫的真實“創建日期”。
      第二步,修改操作系統級的“創建日期”。上述第一步完成后,該數據庫在操作系統級的創建日期也是2026年05月15日,必須加以修改,以達到隱藏真實創建日期的目的。修改操作系統級的“創建日期”可以由下面的程序二完成。

      程序二(VB6):修改文件在操作系統級的“創建日期”
      Private Type FILETIME
      dwLowDateTime As Long
      dwHighDateTime As Long
      End Type
      Private Type SYSTEMTIME
      wYear As Integer
      wMonth As Integer
      wDayOfWeek As Integer
      wDay As Integer
      wHour As Integer
      wMinute As Integer
      wSecond As Integer
      wMilliseconds As Integer
      End Type

      分享:如何判斷一個字段是否在表中
      '判斷一個字段是否在表中 Function BlnField(sTblName As String, sFldName As String) As Boolean 'sTblName 源表名 '要查找的字段名 Dim fld As Field Dim rs As DAO.Recordset BlnField = False Set rs = CurrentDb.OpenRecordset(sTblName) rs.Fields.Re

      共2頁上一頁12下一頁
      來源:模板無憂//所屬分類:Access數據庫教程/更新時間:2010-02-10
      相關Access數據庫教程