2010-12-02 15 views
1

エクストラセキュリティの場合、MS Access 2000(* .mdb)データベースファイルを暗号化/復号化したいと思います。MS Access 2000(* .mdb)データベースファイル(エクストラセキュリティ)

私はDelphi 7を使用していますが、私は無料またはオープンソースのソリューション(ファイル名とキーを渡すことができる2つの関数)を探しています。

私のアプリが起動する前に復号化を実行したいと思います。アプリがシャットダウンすると暗号化が実行されます。これを行うための最良の場所はどこですか? OnCreate、OnDestroyイベントですか?

まず、データベースファイルを暗号化するためにソリューションの暗号化部分を使用する小さなユーティリティを作成する必要がありますか?

おかげ

+0

正確にあなたがこれを行うことによって達成されるでしょうと思いますか?ケース4の場合は –

答えて

1

は、私がアクセス2000および2003のセキュリティが非常に弱いので、あなたが、あなたの古いAccessデータベースを暗号化する必要がある理由は理解しています。私の主な勧告は、Microsoft Cryptographic APIを使用するAccess 2007以上にアップグレードし、セキュリティを大幅に改善することです。

アップグレードできない場合、ここではmdbファイルを暗号化するオプションを残しておきます。

1)あなたはJwaWinCryptユニット(Jedi 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\out.zip', 'C:\temp\in.zip','fdkjldf3832kka83' ,True); 

2ファイルを復号化するファイル

CryptFile('C:\temp\in.zip', 'C:\temp\out.zip','fdkjldf3832kka83' ,True); 

を暗号化するために、このように

を使用)encryot及び復号化するためのコードの位置についてデータは、あなたのアプリケーションの設計に依存します。

3)アプリケーションがクラッシュした場合、データは保護されないことに注意してください。

4)データを復号化してメインアプリケーションを起動し、メインアプリケーションが終了するまでステータスを監視し続ける小さなアプリケーションを作成するのが最善の選択肢です。データを再度暗号化します。

+0

、コンピュータの電源が切れたり、他の「クリーンでない」シャットダウンの場合、データも保護されません。予防措置を講じておらず、アプリケーションがクリーンなシャットダウンで実行されている場合、システムは_working_より前の_monitoring_アプリケーションを閉じることができるため、暗号化されていないファイルで終了することができます。 – jachguate

+0

ありがとう、私はこれを試して、あなたに戻って取得します! – IElite

+0

jachguate、そうです、私の主な勧告は2007年以降のアクセスに更新されたからです。 – RRUZ