加密/解密MS Access 2000(* .mdb)数据库文件(额外的安全性)

时间:2010-12-02 02:09:13

标签: delphi ms-access encryption delphi-7

对于额外安全性,我想加密/解密MS Access 2000(* .mdb)数据库文件。

我正在使用Delphi 7,我正在寻找免费或开源解决方案(可能只有两个允许您传递文件名和密钥的函数)。

我想在我的应用程序启动之前执行解密,并在应用程序关闭时执行加密。哪里是最好的地方。 OnCreate,OnDestroy事件?

我假设我首先必须创建一个小实用程序,它使用解决方案的加密部分来首先加密数据库文件?

感谢

2 个答案:

答案 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)

我建议您查看此网站:http://www.cityinthesky.co.uk/cryptography.html