对于额外安全性,我想加密/解密MS Access 2000(* .mdb)数据库文件。
我正在使用Delphi 7,我正在寻找免费或开源解决方案(可能只有两个允许您传递文件名和密钥的函数)。
我想在我的应用程序启动之前执行解密,并在应用程序关闭时执行加密。哪里是最好的地方。 OnCreate,OnDestroy事件?
我假设我首先必须创建一个小实用程序,它使用解决方案的加密部分来首先加密数据库文件?
感谢
答案 0 :(得分:1)
我理解您必须加密旧访问数据库的原因,因为访问2000和2003的安全性非常弱。但我的主要建议是尝试升级到使用Microsoft Cryptographic API的Access 2007或更高版本,并在安全性方面进行了重大改进。
如果您无法升级,请在此处选择加密您的mdb文件。
1)要加密您的数据,您可以使用属于Jedi JwaWinCrypt
库的JWSCL
单元,您可以从here下载此库。
检查此示例函数,该函数使用3DES算法加密文件。
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);
2)关于加密和解密数据的代码的位置,将取决于您的应用程序的设计。
3)请记住,如果您的应用程序崩溃,您的数据将不受保护。
4)也许最好的选择是构建一个小应用程序,它解密你的数据并启动你的主应用程序,并在主应用程序结束之前一直监视状态。然后再次加密你的数据。
答案 1 :(得分:0)