SQL Server 2005數(shù)據(jù)加密及VB程序實現(xiàn)

目前,在數(shù)據(jù)庫中數(shù)據(jù)存放大多數(shù)都是以明文形式存放,要確保這些數(shù)據(jù)的安全,最有效的辦法是對數(shù)據(jù)進行加密。對存儲在數(shù)據(jù)庫內(nèi)的數(shù)據(jù)進行加密處理后,各用戶的數(shù)據(jù)由各自所擁有的密鑰加密,包括數(shù)據(jù)庫管理員在內(nèi)的其他用戶都無法對獲得的信息進行正常解密,從而保證了用戶信息的安全。那么我們今天就來講一下SQL Server 2005數(shù)據(jù)是如何加密的?

一、SQL Server 2005的數(shù)據(jù)安全

SQL Server 2005將數(shù)據(jù)加密算法和密鑰管理作為數(shù)據(jù)庫的內(nèi)在特性,提供豐富的多層次的加密算法來保護它內(nèi)部的密鑰和數(shù)據(jù),并能根據(jù)用戶需求選擇不同的加密粒度對數(shù)據(jù)進行加密。所有密鑰或證書都由數(shù)據(jù)庫系統(tǒng)內(nèi)部管理,圖1顯示了SQL Sewer 2005采用多層密鑰來保護它內(nèi)部的密鑰和數(shù)據(jù)。

SQL Server 2005數(shù)據(jù)加密及VB程序實現(xiàn)

其中,對稱密鑰適合加解密大量數(shù)據(jù),存在密鑰交付問題,在SQL SeIver中數(shù)據(jù)加解密由內(nèi)部實現(xiàn),則不存在密鑰交付問題。非對稱密鑰有公,私鑰,公鑰能公開發(fā)布,當需要用加密方式向服務器外部傳送數(shù)據(jù)時,這種加密方式更適合。數(shù)字證書可用于驗證密鑰使用者的身份。它們都可以做為加密數(shù)據(jù)的密鑰,也可以傲為保護其他密鑰的密鑰,每個密鑰也能通過設置密碼對自身進行保護。

二、實現(xiàn)加解密數(shù)據(jù)的訪問

下面利用VB語言詞用SQL觸發(fā)器,以數(shù)據(jù)庫中密鑰的操作為實例來說明加解密的過程。其中數(shù)字證書對對稱密鑰加密,對稱密鑰加密用戶數(shù)據(jù),數(shù)字證書由數(shù)據(jù)庫主密鑰和自身設置的密碼保護。

基本步驟如下:

(1) SQL數(shù)據(jù)庫連接

'數(shù)據(jù)庫連接字符串

Public Function sqIConnecLSrring o As StringsqlConnectString=“Provider-SQLOLEDB.l;

&-”Persist Security Info=False;”

&-“User ID=sa;

PWD=密碼;

lnitial Catal08=EncryptionDB;”

&-”Data Sourctcp:192.168.99.4,1026"

End Function

(2)建立密鑰體系

在第一次用密鑰加密數(shù)據(jù)時,需要由用戶在數(shù)據(jù)庫中建立相關密鑰,在此例中建立數(shù)字證書CeIt_Gy和對稱密鑰Sym_Gy,其中數(shù)字證書用于加密對稱密鑰,數(shù)字證書本身由密碼'guoHK.123’進行保護。

Set CNN=New ADODB.Connection

CNN.Open sqlConnectString

’建立數(shù)字證書并用密碼保護

SqICERT=" CREATE CERTIFICATE Cert_Gy ENCRYPTION;

BY PASSWORD='guoHK123' WITH SUBJECI' = 'cert en-cryptlion by password', START_DATE -'2009 -01 -01;

EX-PIRY_DATE=-2009-12-31 "

Cnn.Execute sqICERT

'建立對稱密鑰由數(shù)字證書加密

sqISYM="CREATE SYMMETRIC KEY Sym_Gy WITH ALGORITHM=DES ENCRYPTION BY CERTIFICATE Cert_Gy"

Cnn.Execute sqISYM

(3)數(shù)據(jù)加密存儲

先打開對稱密鑰Sym_Gy,使用加密函數(shù)EncryptByKey()對數(shù)據(jù)進行加密保存到數(shù)據(jù)庫,然后關閉對稱密鑰。主要語句如下:

'打開對稱密鑰Sym_Gy

Cnn.Execute”O(jiān)PEN SYMMETRIC KEY Sym_Gy DE-CRYly兀ON BY CERTIFICATE Cert_Gy With PASSWORD= 'guoHK.123'"

'使用對稱密鑰Sym_Gy對輸人數(shù)據(jù)進行加密存人數(shù)據(jù)庫

SQL=” INSERT INTO test(Loguser,psw,note)VALUES”&_

"("'& Textl&竹,'EncryptByKcy (Key_GUID('Sym_Gy,)"&Text2&",),”&_

"EncryptByKey(Key_GUID('Sym_Gy,) ," &Text3&"7""

Cnn.Execute SQL

'關閉Sym_Gy對稱密鑰

Cnn.Execute”CLOSE SYMMETRIC KEY Sym_Gy”

(4)讀取解密數(shù)據(jù)

當用戶需要讀取數(shù)據(jù)時,打開對稱密鑰Sym_Gy,用解密函數(shù)decryptbykey()進行解密數(shù)據(jù)讀取出明文,最后關閉對稱密鑰,主要語句如下:

'打開對稱密鑰

Cnn .Execute”O(jiān)PEN SYMMETRIC KEY Sym_Gy DE-CRYPTION BY CERTIFICATE Cert_Gy With PASS-WORD='guoHK.123,"

Set Rs=New ADODB.Recordset

'從數(shù)據(jù)庫的表中讀取數(shù)據(jù)解密

Rs.Open"select loguser,cast (decryptbykey (psw) as var-char (20)) as psw,

cast (decryptbykey (note) as varchar(20)) as note from test " , Cnn, adOpenStatic, adLockBatchOptimistic

'關閉Sym_Demo對稱密鑰

Cnn.Execute”CLOSE SYMMETRIC KEY Sym_Gy"

從圖2中看到,從VB實例中輸入的數(shù)據(jù),被用戶生成的對稱密加密保存在數(shù)據(jù)庫中,直接讀取的是亂碼,使用用戶生成的對稱密鑰解密后則能正常讀出明文。

SQL Server 2005數(shù)據(jù)加密及VB程序實現(xiàn)

我們利用SQL Sewer 2005提供的豐富的加密算法進行數(shù)據(jù)的加解密存儲,減少了用戶在編程方面對數(shù)據(jù)庫安全及密鑰的管理等負擔,對程序設計本身影響小,提高了用戶數(shù)據(jù)的安全性。但也還存在一些問題和不足,如大量的數(shù)據(jù)文件加密導致存儲空間增加,數(shù)據(jù)本身的操作性下降,數(shù)據(jù)加解密過程是在數(shù)據(jù)庫中完成,在網(wǎng)絡則是以明文傳輸?shù)?。但不管怎樣,通過調(diào)用SQL Server 2005的內(nèi)置加密特性,給大量使用數(shù)據(jù)庫的用戶提供一個方便的安全存儲空間,最大限度地保證數(shù)據(jù)的存儲安全。

小知識之SQL

SQL是英文Structured Query Language的縮寫,意思為結構化查詢語言。SQL語言的主要功能就是同各種數(shù)據(jù)庫建立聯(lián)系,進行溝通。按照ANSI(美國國家標準協(xié)會)的規(guī)定,SQL被作為關系型數(shù)據(jù)庫管理系統(tǒng)的標準語言。SQL語句可以用來執(zhí)行各種各樣的操作,例如更新數(shù)據(jù)庫中的數(shù)據(jù),從數(shù)據(jù)庫中提取數(shù)據(jù)等。目前,絕大多數(shù)流行的關系型數(shù)據(jù)庫管理系統(tǒng),如Oracle, Sybase, Microsoft SQL Server, Access等都采用了SQL語言標準。