名站网址导航为大家提供关于数据库教程相关的教程网站知识。
防止Access 2000密码被破译的具体相关方法
假如如果您过分信任Access2000网站数据库的密码保护,您可能会因此而蒙受损失。这是因为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, PasswordAs 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 2,应注意的是:上面的“创建日期”只是操作办法系统级的,也就是 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,Private Const GENERIC_WRITE = &h40000000,Private Const OPEN_EXISTING = 3,Private Const FILE_ShARE_READ = &h1,Private Const FILE_ShARE_WRITE = &h2,Private Declare Function SetFileTimeWrite Lib "kernel32" Alias _,"SetFileTime" (ByVal hFile As Long, lpCreateTime As FILETIME, _,ByVal NullP As Long, ByVal NullP2 As Long) As Long,Private Declare Function SystemTimeToFileTime Lib "kernel32" _,(lpSystemTime As SYSTEMTIME, lpFileTime As FILETIME) As Long,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 Closehandle Lib "kernel32" (ByVal hObject As Long) _,As Long,Private Declare Function LocalFileTimeToFileTime Lib "kernel32" _,(lpLocalFileTime As FILETIME, lpFileTime As FILETIME) As Long,Private Sub Command1_Click(),Dim Year As Integer, Month As Integer, Day As Integer,Dim hour As Integer, Minute As Integer, Second As Integer,Dim TimeStamp As Variant, Filename As String, X As Integer,Year = 2001: Month = 3: Day = 13 ' 准备设定的“创建日期”,hour = 12: Minute = 0: Second = 26,TimeStamp = DateSerial(Year, Month, Day) TimeSerial(hour, Minute, Second),Filename = "D:\VB6_Test\MDB_Password\Pass_Protected_DB.mdb" ' 目标网站网站文件名,X = ModifyFileStamp(Filename, TimeStamp),End Sub,Function ModifyFileStamp(Filename As String, TimeStamp As Variant) As Integer,Dim X As Long, handle As Long, System_Time As SYSTEMTIME,Dim File_Time As FILETIME, Local_Time As FILETIME,System_Time.wYear = Year(TimeStamp): System_Time.wMonth = Month(TimeStamp),System_Time.wDay = Day(TimeStamp),System_Time.wDayOfWeek = Weekday(TimeStamp) - 1,System_Time.whour = hour(TimeStamp): System_Time.wSecond = Second(TimeStamp),System_Time.wMilliseconds = 0,X = 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、使用用户级安全机制,通过设置不同的用户帐号和组帐号对网站数据库中的各种资源进行权限管理。这种加强了的安全机制虽然给日常使用(尤其是单用户使用)带来了不便,但在有安全隐患的地方依然有设置的必要。,设置各种帐号及相应权限的简单具体相关方法是使用“设置安全机制向导”(见图四)。图四还显示了安全机制启动后要求用户登录的画面。,三、结论,所谓“道高一尺魔高一丈”,因为这世上并没有绝对的安全。上述具体相关方法一的目的是提高破译的成本以达到常人难以接受的程度;而具体相关方法二的初衷是增加密码的数量。两种具体相关方法的结合足以使破译者望而却步。不过这并不意味着百分
在Access网站数据库中,为了安全起见,可以为所建的网站数据库设置密码。但是,密码忘了怎么办?别急,这里介绍一种找回密码的具体相关方法。
用Access所建的网站数据库,在库网站网站文件的地址00000042处开始的13个字节是Access库的密码位。假如如果一个未加密的库,这13个字节原始数据依次为:86 FB 37 5D 44 9C FA C6 28 E6 13。事实上,当您设置了密码后,Access就将您的密码(请注意您所输入的密码是本文字符)的ACSII码与以上的13个字节数据进行异或操作办法,因此,从库网站网站文件的地址00000042开始的13个字节就变成了密钥了。例如,假如如果您设置的密码为abc,经过异或操作办法后,则从00000042处开始的13个字节的数据变成了E7 99 8F 37 5D 44 9C FA C6 28 E6 13。一个数据经过一次异或操作办法后,再一次经过同样的异或操作办法就可还原了。因此,对已经设置了密码的Access库,只要将13个密钥数据与原始的13个数据进行一次异或操作办法就可得到密码了。
以下是一个C语言的破戒程序:
/*假设加密后的Access库为myacc.mdb,并存放在C盘的根目录下*/
#include ″stdio.h″
main()
{FILE * fp
char mm0[13]={0x86,0xfb,0xec,0x37,0x5d,0x44,0x9c,0xfa,0xc6,0x5e,0x28,0xe6,0x13};
/*这是13个原始数据*/
char mml[13],mm2[13];
/*mm1用来存放加密后的13个密钥;mm2用来存放密码*/
int i,k;
fp=fopen(″c:\\myacc.mdb″,″rb″);
if(fp=NULL){
printf(″\n不能打开该库!″);
exit(0);}
rewind(fp);fseek(fp,0x42L,0);
fread(mm1,13,1,fp);/*读取密钥*/
for(i=0;i<13;i ){
mm2[i]=mm0[i]^mm[i];*/原始数据与密钥异或*/
else
break;}
k=1;fclose(fp);
if(k=0)
printf(″未设密码!″);
else{printf(″\n密码是:\n″);
for(i=0;ibr> printf(″%c,mm2[i]″);}}
顺便提一句,Access库设置密码时,虽然允许输入最多14个密码字符,但只有前13个有效。
关于数据库教程相关的教程网站知识今天我们就说到这里了,希望可以帮到大家。