萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 電腦基礎知識 >  >> 健康知識

Access 2000 資料庫密碼破解原理與防範:隱藏建立日期、啟用用戶級安全

Access 2000 (Jet 4.0) 資料庫密碼保護極其脆弱,一小段 VB6 程式碼即可破解。本文深度剖析破解原理 (利用資料庫建立日期作為加密金鑰),提供兩大防範策略:隱藏真實建立日期 與 啟用用戶級安全機制,並附完整 VB6 實作代碼。

破解原理深度解析

核心弱點:加密金鑰 = 資料庫內部儲存的「建立日期」

  • Access 2000 以資料庫**內部記錄的建立日期** (非檔案系統建立時間) 作為加密種子,對使用者輸入的密碼進行簡單 XOR 加密,儲存於檔案偏移量 &H43 (67 位元組) 起始處,每字元佔 2 位元組 (Unicode)。
  • 破解者建立一個**同樣建立日期的空資料庫** (參考檔),讀取其偏移量 &H43 起始的 20 組雙位元組 (對應最長 20 字元密碼) 作為「明文基準」。
  • 讀取目標受保護資料庫同位置的加密資料,**XOR 運算即可還原密碼明文**:
    密碼明文 = 參考檔資料 XOR 目標檔資料

關鍵細節

  • 「建立日期」為**作業系統層級** (檔案系統目錄項) 與 **資料庫內部** 兩份記錄,通常一致,為破解提供便利。
  • 程式碼僅處理雙位元組首位元組,**僅對非中文密碼有效**;中文密碼需處理雙位元組完整 XOR。

防範策略一:隱藏真實建立日期 (增加破解成本)

步驟 1:建立資料庫時指定「不可思議」的建立日期

  1. 修改系統日期為特殊日期 (如 2026/05/15)。
  2. 建立 Access 資料庫 (此時內部建立日期 = 2026/05/15)。
  3. 將系統日期改回正確日期。

步驟 2:修改檔案系統層級建立日期 (切斷參考)

使用 Win32 API (CreateFile、SetFileTime、SystemTimeToFileTime、LocalFileTimeToFileTime) 將檔案的建立時間修改為普通日期 (如 2001/03/13 12:00:26)。

VB6 實作核心代碼片段:

Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" _
    (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, _
     ByVal lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, _
     ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Private Declare Function SetFileTime Lib "kernel32" _
    (ByVal hFile As Long, lpCreationTime As FILETIME, ByVal lpLastAccessTime As Long, ByVal lpLastWriteTime As Long) As Long
Private Declare Function SystemTimeToFileTime Lib "kernel32" _
    (lpSystemTime As SYSTEMTIME, lpFileTime As FILETIME) As Long
Private Declare Function LocalFileTimeToFileTime Lib "kernel32" _
    (lpLocalFileTime As FILETIME, lpFileTime As FILETIME) As Long

' 設定目標檔案建立時間為 2001/03/13 12:00:26
Dim sysTime As SYSTEMTIME, fileTime As FILETIME, localTime As FILETIME, hFile As Long
sysTime.wYear = 2001: sysTime.wMonth = 3: sysTime.wDay = 13
sysTime.wHour = 12: sysTime.wMinute = 0: sysTime.wSecond = 26
sysTime.wMilliseconds = 0
Call SystemTimeToFileTime(sysTime, localTime)
Call LocalFileTimeToFileTime(localTime, fileTime)
hFile = CreateFile("目標.mdb", GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0)
Call SetFileTime(hFile, fileTime, 0, 0)
Call CloseHandle(hFile)

效果: 破解者需嘗試大量日期組合 (若相差百年需數萬次嘗試),大幅增加破解成本。但屬「治標」,需配合策略二。

防範策略二:啟用用戶級安全機制 (治本)

  • 工具 → 安全性 → 使用者與群組帳號 / 使用者與群組權限。
  • 建立工作群組資訊檔 (.mdw),定義使用者/群組,指派物件權限 (讀取、寫入、設計、管理)。
  • 移除 Admin 使用者的管理權限,建立專屬管理員帳號。
  • 啟用後,資料庫開啟需輸入使用者名稱/密碼,**不再依賴單一資料庫密碼**,安全性質變。

代價: 單用戶使用較繁瑣 (需登入)、開發/部署複雜度提高。但在有安全風險環境下必要。

綜合防護建議

  1. 優先啟用用戶級安全 (策略二),從架構層面解決單一密碼脆弱性。
  2. 輔以隱藏建立日期 (策略一),增加殘留風險 (如舊版備份檔) 的破解難度。
  3. 升級至 Access 2007+ (ACCDB 格式):採用 SHA-1 + RC4/AES 加密,**徹底修復 Jet 4.0 設計缺陷**。
  4. 敏感資料加密儲存:應用層自行加密 (AES-256) 後再寫入資料庫,不依賴資料庫內建加密。
  5. 定期備份並異地加密保存,防範勒索軟體與資料遺失。

道高一尺,魔高一丈。**沒有絕對安全,只有持續提高攻擊成本**。結合架構改良 (用戶級安全)、混淆手段 (隱藏日期)、升級平台 (ACCDB)、應用層加密、備份策略,才能讓 Access 資料庫在惡意環境中生存。

copyright © 萬盛學電腦網 all rights reserved