安全的ACCESS加密方法

來源:互聯網
上載者:User

安全的ACCESS加密方法

徐長友

      Microsoft的ACCESS資料庫,是我們常用的案頭資料之一,大多中小企業的資料庫管理系統都可以採用它,但其安全性一直令人擔猶,試想,一套財務管理系統,使用者直接開啟資料庫去更改資料,後果會如何?有些系統對ACCESS資料庫可能只是更改副檔名,或加個密碼,眾所周知,破解ACCESS密碼的方法和工具網上多的是!所以這樣的加密一樣令人擔猶,下面介紹一個簡單的方法,實現ACCESS資料的加密,供大家參考。

   用UltraEdit開啟MDB檔案可以看到,檔案前16個位元組的內容:
00 01 00 00 53 74 61 6E 64 61 72 64 20 4A 65 74
現在隨便更改幾個,再用ACCESS開啟,發現出現不同識別的檔案格式錯誤,因為ACCESS前面儲存的資訊都是一些MDB檔案的定義和口令,如果更改這些內容,別人就很難看出這個資料庫的格式,無法開啟它了,而且這樣不會對資料庫的內容作更改,不會破壞原有的資料。

下面就用Delphi作個簡單的加密解程式:
 
用到的加密解函數如下:

 const
 titlestr:array[0..15] of byte=
($00,$01,$00,$00,$53,$74,$61,$6E,$64,$61,$72,$64,$20,$4A,$65,$74) ;//對應MDB檔案的前16個位元組
 titlestr2:array[0..15] of byte=
($48,$4A,$00,$58,$55,$43,$48,$41,$4E,$47,$59,$4F,$55,$00,$20,$20) ;//更改後的MDB檔案的前16個位元組,自己隨便寫吧,比如寫上自己公司的簡稱或自已的名
produce EncrypMDB(filename:string); //用titlestr2內容替換MDB前16個位元組,以便實現加密的作用
var F:TFileStream;
begin
   if not fileExists(filename) then  exit;
   F:=TFileStream.create(filename,fmopenwrite);
   try
       F.seek($00,soFromBeginning);
       F.Write(titlestr2,16);
   finally
       F.free;
   end;
end;
produce uncrypMDB(filename:string); //還原MDB前16個位元組
var F:TFileStream;
begin
   if not fileExists(filename) then  exit;
   F:=TFileStream.create(filename,fmopenwrite);
   try
       F.seek($00,soFromBeginning);
       F.Write(titlestr,16);
   finally
       F.free;
   end;
end;

我們知道開啟ACCESS資料庫後會出現一個鎖定檔案(.ldb檔案),因為我們自己也要使用資料庫,所以必須在使用時還原資料庫。
如果還原後沒有進行加密的話,使用者同樣可以複製MDB檔案,然後用ACCESS或其它工具開啟它,所以應該在資料開啟前後都處於加密狀態才能保證資料的安全。
用Delphi採用ADO串連資料庫用以下方法可以實現:

//還原資料,以便自已使用資料庫
copyfile(pchar(APP_path+'/data/account.db'),pchar(app_path+'data/temp.db'),false); //app_path表示程式的目前的目錄,account.db是個更改了副檔名的MDB檔案
uncrypMDB(App_path+'data/temp.db');
copyfile(pchar(App_path+'data/temp.db'),pchar(APP_path+'/data/account.db'),false);
adoconn.connectionstring:='provider=Microsoft.Jet.OLEDB.4.0;Data Source='+App_path+'data/account.db;Persist Security Info=false'; //adocon是個TADOConnection組件
try
  adoconn.connected:=true;
except
  MessageBox(handle,'開啟資料庫出現致命的錯誤!!!','錯誤',MB_OK+MB_ICONERROR);
end;
//開啟後馬上對其加密
copyfile(pchar(APP_path+'/data/account.db'),pchar(app_path+'data/temp.db'),false); //app_path表示程式的目前的目錄,account.db是個更改了副檔名的MDB檔案
EncrypMDB(App_path+'data/temp.db');
copyfile(pchar(App_path+'data/temp.db'),pchar(APP_path+'/data/account.db'),false);
deletefile(App_path+'data/temp.db');
上面使用了兩次臨時檔案,是因為資料庫開啟後再對MDB進行直接的寫入會出現問題,而且你無法去確定多少個使用者開啟了程式。
整個程式共用一個TADOConnection,只在開啟資料庫連接的時候還原MDB檔案,其它時間MDB檔案一直都處於加密狀態!使用者複製了MDB檔案一般很難知道它是什麼!

開啟資料庫後會有一個.ldb檔案,類型會出現ACCESS等字樣,如果你不想讓人看出是什麼的話就修改註冊表吧,如:
reg:=TRegistry.Create;
try
  reg.RootKey:=HKEY_CLASSES_ROOT;
  reg.OpenKey('.ldb');
  reg.WriteString('','tempfile');
finally
  reg.closekey;
  reg.free;
end;
這樣使用者看到的檔案類型是tempfile

註:以上所用資料庫都是指ACCESS 2000,其它版本的我想應該大同小異,自己動手試試吧。大家如有什麼更好的方法或建議,歡迎來信交流:yousoft@chinaren.com

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.