怎樣將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]