您的位置首页百科问答

如何防止Access2000密码被破译的方法

如何防止Access2000密码被破译的方法

的有关信息介绍如下:

如何防止Access2000密码被破译的方法

如果你过分信任 Access 2000数据库的 密码 保护,你可能会因此而蒙受损失。这是因为Access 2000的数据库级 密码 并不安全,相反它很脆弱,甚至下面这段非常小的程序就可以攻破它: ' 程序一(VB6):Access 2000 密码 破译 Private Sub Command1_Click() Cons 如果你过分信任 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 ByteDim I As Integer, Password As String' 打开一个空数据库作为参照Open "D:VB6_TestMDB_PasswordNew_Empty_DB.mdb" For Binary As #1' 打开被密码保护的数据库Open "D:VB6_TestMDB_PasswordPass_Protected_DB.mdb" For Binary As #2Seek #1, OffsetSeek #2, OffsetFor I = 1 To 20 ' Access 2000 数据库密码最长允许20位Get #1, , bEmpty ' 其中每位密码占两个字节Get #2, , bPass ' 一个汉字也仅是一位密码,占两个字节If (bEmpty(1) Xor bPass(1))0 ThenPassword = Password + Chr(bEmpty(1) Xor bPass(1)) ' 将密码解密End IfNextClose 1, 2MsgBox "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 FILETIMEdwLowDateTime As LongdwHighDateTime As LongEnd TypePrivate Type SYSTEMTIMEwYear As IntegerwMonth As IntegerwDayOfWeek As IntegerwDay As IntegerwHour As IntegerwMinute As IntegerwSecond As IntegerwMilliseconds As IntegerEnd TypePrivate Const GENERIC_WRITE = &H40000000Private Const OPEN_EXISTING = 3Private Const FILE_SHARE_READ = &H1Private Const FILE_SHARE_WRITE = &H2Private Declare Function SetFileTimeWrite Lib "kernel32" Alias _"SetFileTime" (ByVal hFile As Long, lpCreateTime As FILETIME, _ByVal NullP As Long, ByVal NullP2 As Long) As LongPrivate Declare Function SystemTimeToFileTime Lib "kernel32" _(lpSystemTime As SYSTEMTIME, lpFileTime As FILETIME) As LongPrivate 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 LongPrivate Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) _As LongPrivate Declare Function LocalFileTimeToFileTime Lib "kernel32" _(lpLocalFileTime As FILETIME, lpFileTime As FILETIME) As LongPrivate Sub Command1_Click()Dim Year As Integer, Month As Integer, Day As IntegerDim Hour As Integer, Minute As Integer, Second As IntegerDim TimeStamp As Variant, Filename As String, X As IntegerYear = 2001: Month = 3: Day = 13 ' 准备设定的“创建日期”Hour = 12: Minute = 0: Second = 26TimeStamp = DateSerial(Year, Month, Day) + TimeSerial(Hour, Minute, Second)Filename = "D:VB6_TestMDB_PasswordPass_Protected_DB.mdb" ' 目标文件名X = ModifyFileStamp(Filename, TimeStamp)End SubFunction ModifyFileStamp(Filename As String, TimeStamp As Variant) As IntegerDim X As Long, Handle As Long, System_Time As SYSTEMTIMEDim File_Time As FILETIME, Local_Time As FILETIMESystem_Time.wYear = Year(TimeStamp): System_Time.wMonth = Month(TimeStamp)System_Time.wDay = Day(TimeStamp)System_Time.wDayOfWeek = Weekday(TimeStamp) - 1System_Time.wHour = Hour(TimeStamp): System_Time.wSecond = Second(TimeStamp)System_Time.wMilliseconds = 0X = SystemTimeToFileTime(System_Time, Local_Time)X = LocalFileTimeToFileTime(Local_Time, File_Time) ' 转换成可用的类型Handle = CreateFile(Filename, GENERIC_WRITE, FILE_SHARE_READ Or _FILE_SHARE_WRITE, ByVal 0&, OPEN_EXISTING, 0, 0) ' 打开文件X = SetFileTimeWrite(Handle, File_Time, ByVal 0&, ByVal 0&) ' 设置日期CloseHandle Handle ' 关闭文件End Function可以看出,隐藏“创建日期”的方法对破译者来说只是增大了破译的工作量,增加了破解试验的次数。只有将该方法与下述的“方法二”相结合,才能达到“既治标又治本”的效果。不过在一般的情况下“方法一”已够用,因为如果破译者起始使用的测试日期与最终的真实日期相差百年,他需要付出数万次的努力!2、使用用户级安全机制通过设置不同的用户帐号和组帐号对数据库中的各种资源进行权限管理。这种加强了的安全机制虽然给日常使用(尤其是单用户使用)带来了不便,但在有安全隐患的地方依然有设置的必要。三、结论所谓“道高一尺魔高一丈”,因为这世上并没有绝对的安全。上述方法一的目的是提高破译的成本以达到常人难以接受的程度;而方法二的初衷是增加密码的数量。两种方法的结合足以使破译者望而却步。不过这并不意味着百分之百的安全。但从思想上提高安全意识,防患于未然,这毕竟是正确的选择。