在企业生产管理系统中,涉密数据的安全性对于企业安全生产、正常运营起着至关重要的作用。为了防止用户非法使用,就非常有必要对数据库中的涉密数据进行保护。当前常用保护方法就是数据加密技术,利用该技术可实现对重要数据存储的安全保护。

一、常见的数据库加密方法

数据库中数据加密的粒度一般有表级、记录级、字段级和数据级4种,加密粒度越小,则适用范围越广,但实现难度就越大。目前,以记录或字段为加密粒度居多。数据加密通过对明文进行复杂的加密操作,以达到无法发现明文和密文之间、密文和密钥之间的内在关系,也就是说经过加密的数据经得起来自操作系统和数据库管理系统的攻击。另一方面,数据库管理系统要完成对数据库文件的管理和使用,必须具有能够识别部分数据的条件。

数据库加密时,要处理好以下几方面问题。

(1)加密效率问题:加密解密系统的操作时间应尽量短,对系统合法用户来说,各种数据操作是透明的,不需要考虑数据的加密解密效率问题;

(2)数据类型表示:加密时,在不增加系统空间开销的情况下,处理好数据存储问题,保证数据类型的一致性;

(3)密钥安全性问题:密钥要能动态设置,最好同时采用多个密钥进行不同数据的加密。

在实现时,本文仅采用一个密钥进行加密。

二、如何利用RSA加密算法实现数据库的加密和解密

RSA加密算法是公开密钥密码体制中最优秀的加密算法,其理论基础是数论中的一个重要论断,即求两个大素数之积是容易的,而将一个具有大素数因子的合数进行分解却是非常困难的。

为提高加密解密效率,本系统中专门设置了加密解密字典,开发了加密解密字典管理程序和数据库加密解密引擎。数据库加密系统将用户对数据库信息具体的加密要求记载在加密字典中,加密字典是数据库加密系统的基础信息。加密字典管理程序,是管理加密字典的实用程序,数据库管理员通过它变更加密要求,它通过数据库加密解密引擎实现对数据库表的加密、解密及数据转换等功能。数据库加密解密引擎是数据库加密系统的核心部件,负责在后台完成数据库涉密信息的加密解密处理,对应用开发人员和操作人员是透明的。

其对应的部分源程序如下:

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)

......

}

}

按上述方式实现的数据库加密系统具有以下优点:

(1)系统对数据库的最终用户完全透明;

(2)系统完全独立于数据库应用系统,不需要改动数据库应用系统就能实现加密功能。

三、多线程技术的应用

利用RSA算法实现对数据库的加密解密,安全性是可以得到保证了。但是,RSA算法的安全性依赖于模数的因子分解,数值增加到一定程度,加密解密工作的时间将急速增加。为在保证安全性的基础上实现对数据库的快速加密解密,利用以下方法进行改进。

(1)事先设置加密表、解密表,存放于独立的数据库中;

(2)对数据库中的部分涉及机密的数据表进行加密,而不是全部加密;

(3)对数据表中数据加密解密时,利用多线程技术,对不同的记录分别加密解密。

在VB.NET中多线程的功能通过Sy8tem.Threadin&Thread类进行控制和实现。本系统中,使用线程实现数据表中记录加密解密工作。因为VB.NET提供的创建线程和启动线程的方法没有明显的提供参数,但我们实现加密解密的方法带有一个参数a为了实现这个过程,建立下面的一个.NET类,也是要用线程启动的方法的载体。下面仅以加密工作为例说明其实现过程。加密类及相关代码如下所示:

namespace WindowsApplicationDecoding

I public class ClassDecoding{

privaLe integer _parameter;

public ClassDecoding (integer parameter){

thi8._parameter= parametefi

public void DecodingMethodl(){

if(tbis:parameter!=nuIDt

//对尾数是参数_parameter的记录加密

}

}

public ClassDecoding(){}

prirrate void DecodingMethod2(integer parameter){

//对尾数足参数_parameter的记录加密

}

public void DecodingMethod2(object parameter)}

this. DecodingMethod2((integer)parameterk

}

}

}

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

Fori=l t0 10,,数据表中记录加密工作被分成10部分同时进行

Cla8sDecoding in8tance=new ClassDecoding(i);

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

EndFor

}

使用线程后,确实可以提高加密解密速度,但是多线程需要用更多的时间和精力来控制线程,从而实现线程之间的轮询和状态转换。为了自动完成这些工作,本系统中引入了线程池,更加有效地发挥了多线程的优势,优化了数据库加密解密的性能。使用线程池,需要使用过程委托来调用Tread Po01类的QueueU8erWorkltem方法。以下代码说明了如何使用线程池启动多个任务。

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

For i=l t0 10,,数据表中记录加密工作被分成10部分同时进行

ClassDecoding in8tance=new ClassDecodin g0;

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

EndFor

}

小知识之多线程技术

采用超线程即是可在同一时间里,应用程序可以使用芯片的不同部分。虽然单线程芯片每秒钟能够处理成千上万条指令,但是在任一时刻只能够对一条指令进行操作。而超线程技术可以使芯片同时进行多线程处理,使芯片性能得到提升。