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

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的安全性非常弱。但我的主要建议是尝

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

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

我想在应用程序启动前执行解密,在应用程序关闭时执行加密。在哪里做这件事最好。一旦创建,OnDestroy事件

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


谢谢

我理解您必须加密旧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等)。