怎樣將access表加密(access資料庫如何加密)

1,加密後臺資料庫的方法

轉載自:
   http://www.chinageren.com/jc/HTML/101608.html

地球人都知道,MDB檔案很不安全,破解MDB檔案密碼的軟體層出不窮,那是否如果我們MDB作後臺資料庫,是不是就等於任人宰割了呢?我覺得未必是這樣的。

我用過不少Access密碼破解器,大多數都只能處理英文密碼,因此我們可以針對這一特點,把MDB檔案的資料庫密碼設定為中文的,這樣就可以抵擋大部份破解器的攻擊了。

一定有人會說,既然人家能寫出破解英文密碼的軟體,一定也可以寫出破解中文密碼的軟體。這句話一點都沒錯,不過我們還有第二招:更改檔案頭。

MDB的頭16個位元組儲存著檔案型別、版本等諸如此類的重要資訊,Access靠這些資訊來識別它們,如果我們改動一個或多個位元組,Access就會因無法識別這些檔案而打不開它們,也就達到了我們的目的:加密MDB檔案。加密思路如下:

開啟檔案時,把正確的標頭檔案內容寫入相應的位置,我們自已的程式就可以訪問它,關閉檔案時把更改過的錯誤的標頭檔案內容寫入相應的位置。這樣做有個弊端,就是程式執行時,後臺檔案是可以訪問的,只有關閉後才加密,那麼當程式執行時,別人如果知道了資料庫密碼,還是可以檢視或匯出資料的。

另一種做法是開啟後臺資料庫後,馬上建立一個持續到程式結束的物理連線,然後再把錯誤的檔案頭內容寫入相應的位置,這樣在程式執行當中,我們的前臺程式是可以正常訪問後臺資料的,而不知道我們的加密方法的人是無法開啟後臺檔案的。

‘使後臺可以正常訪問

Function OpenHt(HTmdbPath As String)

Dim fh As Integer

fh = FreeFile

Open HTmdbPath For Binary Access Write As #fh

Put fh, 2, &H1

Close #fh

End Function

‘使後臺無法正常訪問

Function CloseHt(HTmdbPath As String)

Dim fh As Integer

fh = FreeFile

Open HTmdbPath For Binary Access Write As #fh

Put fh, 2, &H0

Close #fh

End Function

‘下面的都是跟後臺建立物理連線的函式(必須放在模組裡)

Public HTcn As Connection

Public HTrs As New ADODB.Recordset

Public HTsql As String

‘建立物理連線

Function OpenStandHT()

Set HTcn = CurrentProject.Connection

‘表1要改成相應的表名

HTsql = “select * from 表1”

HTrs.Open HTsql, HTcn, 3, 3, 1

End Function

‘關閉物理連線的函式,如退出程式時,或需要壓縮後臺檔案時就要關閉物理連線

Function CloseStandHT()

HTrs.Close

Set HTcn = Nothing

End Function

2,安全的ACCESS加密方法

作者:徐長友

from:http://feimo.vse.net.cn/11/16/15/3AF8B33C-F1E4-4A78-8B7C-894447566C59.shtml

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,其它版本的我想應該大同小異,自己動手試試吧。大家如有什麼更好的方法或建議,歡迎來信交流:[email protected]