Delphi 加密/解密MS Access 2000(*.mdb)数据库文件(额外安全性)
为了额外的安全性,我想加密/解密MS Access 2000(*.mdb)数据库文件 我正在使用Delphi7,我正在寻找一个免费或开源的解决方案(可能只有两个函数允许您传递文件名和密钥) 我想在应用程序启动前执行解密,在应用程序关闭时执行加密。在哪里做这件事最好。一旦创建,OnDestroy事件 我假设我首先必须创建一个小实用程序,它首先使用解决方案的加密部分来加密数据库文件Delphi 加密/解密MS Access 2000(*.mdb)数据库文件(额外安全性),delphi,ms-access,encryption,delphi-7,Delphi,Ms Access,Encryption,Delphi 7,为了额外的安全性,我想加密/解密MS Access 2000(*.mdb)数据库文件 我正在使用Delphi7,我正在寻找一个免费或开源的解决方案(可能只有两个函数允许您传递文件名和密钥) 我想在应用程序启动前执行解密,在应用程序关闭时执行加密。在哪里做这件事最好。一旦创建,OnDestroy事件 我假设我首先必须创建一个小实用程序,它首先使用解决方案的加密部分来加密数据库文件 谢谢我理解您必须加密旧access数据库的原因,因为access 2000和2003的安全性非常弱。但我的主要建议是尝
谢谢我理解您必须加密旧access数据库的原因,因为access 2000和2003的安全性非常弱。但我的主要建议是尝试升级到Access 2007或更高版本,该版本使用Microsoft Cryptographic API,并在安全性方面进行了重大改进 如果您不能升级,这里我留下一个选项来加密您的mdb文件 1) 要加密您的数据,您可以使用属于Jedi
JWSCL
库的JwaWinCrypt
单元,您可以从下载此库
检查这个使用算法加密文件的示例函数
uses
Classes,
JwaWinType,
JwaWinCrypt,
SysUtils;
procedure CryptFile(Const InFileName, OutFileName, Password: AnsiString; Encrypt: Boolean);
const
BufferSize=1024*64;
var
StreamSource : TFileStream;
StreamDest : TFileStream;
CRYPTPROV : HCRYPTPROV;
CRYPTHASH : HCRYPTHASH;
CRYPTKEY : HCRYPTKEY;
Buffer : LPBYTE;
BytesIn : DWORD;
Final : Boolean;
begin
CryptAcquireContext(CRYPTPROV, nil, nil, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
try
CryptCreateHash(CRYPTPROV, CALG_3DES_112, 0, 0, CRYPTHASH);
try
CryptHashData(CRYPTHASH, @Password[1], Length(Password), 0);
CryptDeriveKey(CRYPTPROV, CALG_3DES, CRYPTHASH, 0, CRYPTKEY);
finally
CryptDestroyHash(CRYPTHASH);
end;
StreamSource := TFileStream.Create(InFileName, fmOpenRead or fmShareDenyWrite);
StreamDest := TFileStream.Create(OutFileName, fmCreate);
try
GetMem(Buffer, BufferSize);
try
repeat
BytesIn := StreamSource.Read(Buffer^, BufferSize);
Final := (StreamSource.Position >= StreamSource.Size);
if Encrypt then
CryptEncrypt(CRYPTKEY, 0, Final, 0, Buffer, BytesIn, BytesIn)
else
CryptDecrypt(CRYPTKEY, 0, Final, 0, Buffer, BytesIn);
StreamDest.Write(Buffer^, BytesIn);
until Final;
finally
FreeMem(Buffer, BufferSize);
end;
finally
StreamSource.Free;
StreamDest.Free;
end;
finally
CryptReleaseContext(CRYPTPROV, 0);
end;
end;
并以这种方式使用
加密文件
CryptFile('C:\temp\in.zip', 'C:\temp\out.zip','fdkjldf3832kka83' ,True);
CryptFile('C:\temp\out.zip', 'C:\temp\in.zip','fdkjldf3832kka83' ,True);
解密文件
CryptFile('C:\temp\in.zip', 'C:\temp\out.zip','fdkjldf3832kka83' ,True);
CryptFile('C:\temp\out.zip', 'C:\temp\in.zip','fdkjldf3832kka83' ,True);
2) 关于加密和解密数据的代码的位置,将取决于应用程序的设计
3) 请记住,如果应用程序崩溃,您的数据将不受保护
4) 也许最好的选择是构建一个小型应用程序,对数据进行解密并启动主应用程序,并一直监视状态,直到主应用程序结束。然后再次加密您的数据。我理解您必须加密旧access数据库的原因,因为access 2000和2003的安全性非常弱。但我的主要建议是尝试升级到Access 2007或更高版本,该版本使用Microsoft Cryptographic API,并在安全性方面进行了重大改进 如果您不能升级,这里我留下一个选项来加密您的mdb文件 1) 要加密您的数据,您可以使用属于Jedi
JWSCL
库的JwaWinCrypt
单元,您可以从下载此库
检查这个使用算法加密文件的示例函数
uses
Classes,
JwaWinType,
JwaWinCrypt,
SysUtils;
procedure CryptFile(Const InFileName, OutFileName, Password: AnsiString; Encrypt: Boolean);
const
BufferSize=1024*64;
var
StreamSource : TFileStream;
StreamDest : TFileStream;
CRYPTPROV : HCRYPTPROV;
CRYPTHASH : HCRYPTHASH;
CRYPTKEY : HCRYPTKEY;
Buffer : LPBYTE;
BytesIn : DWORD;
Final : Boolean;
begin
CryptAcquireContext(CRYPTPROV, nil, nil, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
try
CryptCreateHash(CRYPTPROV, CALG_3DES_112, 0, 0, CRYPTHASH);
try
CryptHashData(CRYPTHASH, @Password[1], Length(Password), 0);
CryptDeriveKey(CRYPTPROV, CALG_3DES, CRYPTHASH, 0, CRYPTKEY);
finally
CryptDestroyHash(CRYPTHASH);
end;
StreamSource := TFileStream.Create(InFileName, fmOpenRead or fmShareDenyWrite);
StreamDest := TFileStream.Create(OutFileName, fmCreate);
try
GetMem(Buffer, BufferSize);
try
repeat
BytesIn := StreamSource.Read(Buffer^, BufferSize);
Final := (StreamSource.Position >= StreamSource.Size);
if Encrypt then
CryptEncrypt(CRYPTKEY, 0, Final, 0, Buffer, BytesIn, BytesIn)
else
CryptDecrypt(CRYPTKEY, 0, Final, 0, Buffer, BytesIn);
StreamDest.Write(Buffer^, BytesIn);
until Final;
finally
FreeMem(Buffer, BufferSize);
end;
finally
StreamSource.Free;
StreamDest.Free;
end;
finally
CryptReleaseContext(CRYPTPROV, 0);
end;
end;
并以这种方式使用
加密文件
CryptFile('C:\temp\in.zip', 'C:\temp\out.zip','fdkjldf3832kka83' ,True);
CryptFile('C:\temp\out.zip', 'C:\temp\in.zip','fdkjldf3832kka83' ,True);
解密文件
CryptFile('C:\temp\in.zip', 'C:\temp\out.zip','fdkjldf3832kka83' ,True);
CryptFile('C:\temp\out.zip', 'C:\temp\in.zip','fdkjldf3832kka83' ,True);
2) 关于加密和解密数据的代码的位置,将取决于应用程序的设计
3) 请记住,如果应用程序崩溃,您的数据将不受保护
4) 也许最好的选择是构建一个小型应用程序,对数据进行解密并启动主应用程序,并一直监视状态,直到主应用程序结束。然后再次加密您的数据。我建议您检查此站点:我建议您检查此站点:您认为这样做会实现什么?您认为这样做会实现什么?在案例4中,如果计算机电源故障或任何其他“不干净”关机数据也将不受保护。如果您不采取预防措施,并且应用程序仍在完全关闭的情况下运行,则系统可能会在运行监控应用程序之前关闭该应用程序,因此仍有可能以未加密的文件结束。谢谢,我将尝试一下,然后再与您联系!jachguate,你是对的,因为我的主要建议是更新到access 2007或更新版本。@jachguate:“在案例4中,如果计算机电源出现故障或任何其他”不干净“关机数据也将不受保护。如果您没有采取预防措施,并且应用程序仍在完全关闭的情况下运行,则系统可能会在运行监控应用程序之前关闭该应用程序,因此仍有可能以未加密的文件结束。“-这是一个大问题,因此,我将放弃尝试,说服客户机转移到更新版本的MS ACCESS或diff数据库(MS SQL SERVER等)。在案例4中,如果计算机电源出现故障或任何其他“不干净”关机,数据也将不受保护。如果您不采取预防措施,并且应用程序仍在完全关闭的情况下运行,则系统可能会在运行监控应用程序之前关闭该应用程序,因此仍有可能以未加密的文件结束。谢谢,我将尝试一下,然后再与您联系!jachguate,你是对的,因为我的主要建议是更新到access 2007或更新版本。@jachguate:“在案例4中,如果计算机电源出现故障或任何其他”不干净“关机数据也将不受保护。如果您没有采取预防措施,并且应用程序仍在完全关闭的情况下运行,则系统可能会在运行监控应用程序之前关闭该应用程序,因此仍有可能以未加密的文件结束。“-这是一个大问题,因此,我将放弃这一尝试,说服客户机一起使用更新版本的MS ACCESS或diff数据库(MS SQL SERVER等)。