數(shù)據(jù)庫加密中多線程技術(shù)的應(yīng)用

在企業(yè)生產(chǎn)管理系統(tǒng)中,涉密數(shù)據(jù)的安全性對于企業(yè)安全生產(chǎn)、正常運營起著至關(guān)重要的作用。為了防止用戶非法使用,就非常有必要對數(shù)據(jù)庫中的涉密數(shù)據(jù)進行保護。當(dāng)前常用保護方法就是數(shù)據(jù)加密技術(shù),利用該技術(shù)可實現(xiàn)對重要數(shù)據(jù)存儲的安全保護。

一、常見的數(shù)據(jù)庫加密方法

數(shù)據(jù)庫中數(shù)據(jù)加密的粒度一般有表級、記錄級、字段級和數(shù)據(jù)級4種,加密粒度越小,則適用范圍越廣,但實現(xiàn)難度就越大。目前,以記錄或字段為加密粒度居多。數(shù)據(jù)加密通過對明文進行復(fù)雜的加密操作,以達到無法發(fā)現(xiàn)明文和密文之間、密文和密鑰之間的內(nèi)在關(guān)系,也就是說經(jīng)過加密的數(shù)據(jù)經(jīng)得起來自操作系統(tǒng)和數(shù)據(jù)庫管理系統(tǒng)的攻擊。另一方面,數(shù)據(jù)庫管理系統(tǒng)要完成對數(shù)據(jù)庫文件的管理和使用,必須具有能夠識別部分數(shù)據(jù)的條件。

數(shù)據(jù)庫加密時,要處理好以下幾方面問題。

(1)加密效率問題:加密解密系統(tǒng)的操作時間應(yīng)盡量短,對系統(tǒng)合法用戶來說,各種數(shù)據(jù)操作是透明的,不需要考慮數(shù)據(jù)的加密解密效率問題;

(2)數(shù)據(jù)類型表示:加密時,在不增加系統(tǒng)空間開銷的情況下,處理好數(shù)據(jù)存儲問題,保證數(shù)據(jù)類型的一致性;

(3)密鑰安全性問題:密鑰要能動態(tài)設(shè)置,最好同時采用多個密鑰進行不同數(shù)據(jù)的加密。

在實現(xiàn)時,本文僅采用一個密鑰進行加密。

二、如何利用RSA加密算法實現(xiàn)數(shù)據(jù)庫的加密和解密

RSA加密算法是公開密鑰密碼體制中最優(yōu)秀的加密算法,其理論基礎(chǔ)是數(shù)論中的一個重要論斷,即求兩個大素數(shù)之積是容易的,而將一個具有大素數(shù)因子的合數(shù)進行分解卻是非常困難的。

為提高加密解密效率,本系統(tǒng)中專門設(shè)置了加密解密字典,開發(fā)了加密解密字典管理程序和數(shù)據(jù)庫加密解密引擎。數(shù)據(jù)庫加密系統(tǒng)將用戶對數(shù)據(jù)庫信息具體的加密要求記載在加密字典中,加密字典是數(shù)據(jù)庫加密系統(tǒng)的基礎(chǔ)信息。加密字典管理程序,是管理加密字典的實用程序,數(shù)據(jù)庫管理員通過它變更加密要求,它通過數(shù)據(jù)庫加密解密引擎實現(xiàn)對數(shù)據(jù)庫表的加密、解密及數(shù)據(jù)轉(zhuǎn)換等功能。數(shù)據(jù)庫加密解密引擎是數(shù)據(jù)庫加密系統(tǒng)的核心部件,負責(zé)在后臺完成數(shù)據(jù)庫涉密信息的加密解密處理,對應(yīng)用開發(fā)人員和操作人員是透明的。

其對應(yīng)的部分源程序如下:

public cla88 RSAHandler{

public RSACryptSerProvider CreateRSAProvider(String privateKeyFile){

parameters2.F18gs=CspProviderFhgs.UseMacbineKey-Store;

RSACryptSerProvider providerl=new RSACryptSer-Provider(parameter82);

pro,riderl.lmportParameter~parameter81);

return providerl;

}

public RSACryptSerProvider CreateRSAEnc ryptProvider(String publicKeyFile){

parameter82.Flags=C8pPro riderFlags.U8eMachineKey-Store;

RSACryptSerProvider providerl=new RSACryptSer~Pro'vider(parameters2);

proyiderl.ImportParameters(parameter81);

return providerl;

}

public RSADeformatter CreateRSADeformatter (StringpublicKeyFile){

......

parameters2.Flags=CspProviderFlaS;s.UseMachineKey--Store;

RSACryptSerProvider providerl=new RSACryptSer-Provide~parameters2);

providerljmporl Parameters(par8metersl);

RSADeformatter deformatter = new RSADeformatter(providerl);

......

}

Rublic RSAFormatter CreateRSAFormatter (String pri-vateKeyFile){

parameters2.Flags=CspProviderFlags.UseMachineKey-Store;

RSACryptSerProvider providerl=new RSACryptSer-Providedparameters2);

providerl.lmportParajueters(parameter8 );

RSAFormatterformatter=new RSAFormatte(providerl)

......

}

}

按上述方式實現(xiàn)的數(shù)據(jù)庫加密系統(tǒng)具有以下優(yōu)點:

(1)系統(tǒng)對數(shù)據(jù)庫的最終用戶完全透明;

(2)系統(tǒng)完全獨立于數(shù)據(jù)庫應(yīng)用系統(tǒng),不需要改動數(shù)據(jù)庫應(yīng)用系統(tǒng)就能實現(xiàn)加密功能。

三、多線程技術(shù)的應(yīng)用

利用RSA算法實現(xiàn)對數(shù)據(jù)庫的加密解密,安全性是可以得到保證了。但是,RSA算法的安全性依賴于模數(shù)的因子分解,數(shù)值增加到一定程度,加密解密工作的時間將急速增加。為在保證安全性的基礎(chǔ)上實現(xiàn)對數(shù)據(jù)庫的快速加密解密,利用以下方法進行改進。

(1)事先設(shè)置加密表、解密表,存放于獨立的數(shù)據(jù)庫中;

(2)對數(shù)據(jù)庫中的部分涉及機密的數(shù)據(jù)表進行加密,而不是全部加密;

(3)對數(shù)據(jù)表中數(shù)據(jù)加密解密時,利用多線程技術(shù),對不同的記錄分別加密解密。

在VB.NET中多線程的功能通過Sy8tem.Threadin&Thread類進行控制和實現(xiàn)。本系統(tǒng)中,使用線程實現(xiàn)數(shù)據(jù)表中記錄加密解密工作。因為VB.NET提供的創(chuàng)建線程和啟動線程的方法沒有明顯的提供參數(shù),但我們實現(xiàn)加密解密的方法帶有一個參數(shù)a為了實現(xiàn)這個過程,建立下面的一個.NET類,也是要用線程啟動的方法的載體。下面僅以加密工作為例說明其實現(xiàn)過程。加密類及相關(guān)代碼如下所示:

namespace WindowsApplicationDecoding

I public class ClassDecoding{

privaLe integer _parameter;

public ClassDecoding (integer parameter){

thi8._parameter= parametefi

public void DecodingMethodl(){

if(tbis:parameter!=nuIDt

//對尾數(shù)是參數(shù)_parameter的記錄加密

}

}

public ClassDecoding(){}

prirrate void DecodingMethod2(integer parameter){

//對尾數(shù)足參數(shù)_parameter的記錄加密

}

public void DecodingMethod2(object parameter)}

this. DecodingMethod2((integer)parameterk

}

}

}

private void butDecodinlLClick (object 8ender. SysLewEventArgs e)(

Fori=l t0 10,,數(shù)據(jù)表中記錄加密工作被分成10部分同時進行

Cla8sDecoding in8tance=new ClassDecoding(i);

new Thread (new ThreadStart(instance.Cla8sDecoding))Start0;

EndFor

}

使用線程后,確實可以提高加密解密速度,但是多線程需要用更多的時間和精力來控制線程,從而實現(xiàn)線程之間的輪詢和狀態(tài)轉(zhuǎn)換。為了自動完成這些工作,本系統(tǒng)中引入了線程池,更加有效地發(fā)揮了多線程的優(yōu)勢,優(yōu)化了數(shù)據(jù)庫加密解密的性能。使用線程池,需要使用過程委托來調(diào)用Tread Po01類的QueueU8erWorkltem方法。以下代碼說明了如何使用線程池啟動多個任務(wù)。

private void butDecoding_Click (object gcnder, System.EventArgs e){

For i=l t0 10,,數(shù)據(jù)表中記錄加密工作被分成10部分同時進行

ClassDecoding in8tance=new ClassDecodin g0;

ThreadPooI.QueueUserWorkltem (new WaitCallback(instance.DecodingMetbod2)j);

EndFor

}

小知識之多線程技術(shù)

采用超線程即是可在同一時間里,應(yīng)用程序可以使用芯片的不同部分。雖然單線程芯片每秒鐘能夠處理成千上萬條指令,但是在任一時刻只能夠?qū)σ粭l指令進行操作。而超線程技術(shù)可以使芯片同時進行多線程處理,使芯片性能得到提升。