随着互联网技术的不断进步,嵌入式数据库系统用途广泛,如用于消费电子产品、移动计算设备、企业实时管理应用、网络存储与管理以及各种专用设备,这一市场目前正处于高速增长之中。但同时由于嵌入式数据库是使用越来越广泛,它的安全问题自然是变的越来越重要。

一、加密嵌入式数据库管理系统总体设计

目前安全嵌入式数据库管理系统的研究还处于探索阶段,没有自己的设计原则,故只能在分析嵌入式数据库管理系统和安全数据库管理系统设计原则的基础上,对ESDBMS进行有探索性的研究。

1、安全数据库管理系统的设计原则

在安全数据库管理系统的设计方面,作为保存数据和信息记录的数据库系统的管理系统,应当提供对信息和数据的安全存取的服务,即在向授权用户提供可靠的信息/数据服务的同时,又要拒绝非授权的对数据的存取访问请求,保证数据库管理下的数据的可用性、完整性和一致性,进而保护数据库所有者和使用者的合法权益。其基本安全要求为:保密性;完整正确;信息在存储或传输过程中保持不被修改、不被破坏和不丢失。

2、ESDBMS框架设计与模块划分

对应用于电力系统的ESDBMS安全策略和数据库结构模型确定以后,ESDBMS的框架结构也就顺理成章了。本文把数据库管理系统划分为四个模块:安全后端模块、安全数据库引擎模块、安全前端模块和安全事务处理模块。在每个模块的具体设计中,将有机地融合安全功能,从而保证数据库管理系统整体的安全性。

二、安全后端模块及加密设计与实现

为了减少开发难度,安全后端模块的设计采用分层设计的思想,屏蔽掉各层之间的差异性,实现高层向低层的透明调用,这样有利于降低层次之间的耦合度。并且对于ESDBMS的其它功能模块,它们可以透明地调用安全后端模块最高层提供的标准接口,而不需要了解安全后端模块的底层实现机制,这样有利于安全后端模块的拆卸和扩充,有利于实现ESDBMS整体的模块化。

cache管理子模块是本地文件系统和其它上层模块之间的中间模块。它是通过本地操作系统IO API访问本地数据库和日志文件的模块,即定义一个易于使用,独立于文件系统的接口,用来从数据库文件中访问页面。cache管理子模块的功能就是将用户所需要的数据项从数据库文件中读入主存,并在内存中操作,如果有需要,再把它写回数据库文件。这种功能可以归结为cache读操作,cache写操作和cache替换操作,下面分别设计实现。

1、cache读操作

通过检索关键字pPcm引用cache。为了读取一页,是通过Pcm API函数来实现。表和索引管理模块调用基于页码的ES-DBMSPcm_get这个函数,其中关键部分伪代码如下:

If(pPg==0){//没有找到P

if (pPcm->nPagemxPage){//是否有free slot

PPg=ESDBMSMallocRaw( sizeof(*pPg));//获取free slot

address_retum(pPg);

return ESDBMS OK;

}

else

{

if(pPg->dirty){//见有slot是否dirty?

写回数据库文件;

pPg->dirty=0;

rc=pager_recycle(pPcm,l,&pPg);//释放该slot

if(rc!=ESDBMS_OK)(//出错处理

retum rc;}

把P页从数据库文件读到该810t;

address_retum(pPg);)

Else{address_return(pPg);

return ESDBMS OK}

2、cache写操作

当一页地址返回给表和索引管理模块,cache管理模块并不知表和索引管理模块什么时候对此页操作。ESpBMS对每一页按照如下协议:获得页面,使用页面,然后释放页面。获取页面之后,表和索引管理模块可以直接改变页面的内容,但是它必须在修改页面内容之前调用ESDBMSPcm_ writeo API函数。

3、cache替换操作

当cache已经用完,此时需要移出cache中的旧页,以便为新页腾出地方。即在cache读时,当一个请求的页不在cache中,并且在cache中并没有free slot那么cache管理模块就会替换掉一个slot。这个被替换掉的slot按照cache替换策略执行,ESDBMS使用最近最少使用(LRU)cache替换策略。

4、加密子模块的设计与实现

在物理存储之前完成其加密解密工作;加密粒度为文件级别;采用基于口令的加密方法,密钥由口令而产生;加密算法是AES,为了避免加密的开始就过多的考虑底层的数据格式,选择计数器模式把AES加密块转换成256位的加密流,不需要任何的填充操作,密文和原来的明文有相同的长度,比其他的模式节省空间。加密过程中首先将整个数据库划分成块,每个块都可以作为一个单独的AES加密块,在计数器和由口令和盐产生的密钥作用下加密。

其中ESDBMScodecattachQ函数是用口令来连接相应的数据库,用户的口令通过get_a_keys函数而获得。由于采用的是AES加密算法,计数器模式,密钥和密文就有确定的大小,系统就能准确分配空间。图中Salt值在这里没有采用随机产生的方法,而是采用固定值,这样减小了空间存入额外信息的开销。

加密和解密用的是相同的算法,即AES encrypt key256和AES decrypt key256都使用Rijndael算法。首先初始化一个进程的计数器,把数据库分成一个一个的块,每个都作为一个单独的AES加密块(为256位),每个块都从O开始编号,依据传入编码函数的page size和page number参数,算出计数块内的计数值f等于块的编号1和偏移量,然后用它来初始化加密流,贯穿加密模块过程始终的数据结构是:

typedef struct {

aes encrypt ctx cx;1/加密内容

unsigned char key[KEYes LEN];

unsigned char newKey[KEYee LEN];

int isKeyed;//如果设定了口令置true

int isReKey;//如果重新设定口令置true

Httee*bt:删昔向B+tree的指针

}stDbSeclnfo;

三、事务管理模块的分析与设计

事务是一系列的数据库操作,是数据库应用程序的基本逻辑单元。应用程序不能直接从数据库中读或者写数据,除非通过读和写事务处理操作特别是在电力系统这种关系国计民生的产业应用中,更要确保数据的完整性和安全性。事务管理中最重要的两个功能就是并发事务的处理和日志文件的管理。事务管理有两个组成部分:一般处理和恢复处理,一般处理的操作主要是指读事务和写事务,即从数据库文件读page和写page。

(1)读操作

为了能在数据库的page上进行操作,B+树需要应用以pg-不存在则页面缓冲管理模块创建page。如果文件的shared或更强的锁还没有获得,函数就获得该文件的shared锁。如果请求sha-ed锁失败,那么就代表其它事务具有与之不可兼容锁,然后它返回ESDBMS BUSY错误代码给调用者。否则它就执行一个cache读操作,返回page给调用者。

(2)写操作

修改page之前,通过调用ESDBMSPcm_get函数,表和索引管理子模块选定page。页面缓冲管理模块申请page所在数据库文件的reserved锁。如果申请re8erved锁失败,则返回ES-DBMSes_BUSY给调用者。调用ESDBMSPcm_write函数,如图5所示。

cl小知识之嵌入式数据库
嵌入式数据库的名称来自其独特的运行模式。这种数据库嵌入到了应用程序进程中,消除了与客户机服务器配置相关的开销。嵌入式数据库实际上是轻量级的,在运行时,它们需要较少的内存。它们是使用精简代码编写的,对于嵌入式设备,其速度更快,效果更理想。嵌入式运行模式允许嵌入式数据库通过 SQL 来轻松管理应用程序数据,而不依靠原始的文本文件。嵌入式数据库还提供零配置运行模式,这样可以启用其中一个并运行一个快照。