SQLite作为一个开源的嵌入武数据库,具有系统开销小、检索效率高等特性。但由于受到空间限制和性能要求,需要更为简洁的加密方法来实现对数据的安全保障。

一、SQLite嵌入式数据库的简介

1、SQLite的产生和发展

SQLite是2000年开发出来的用一个小型C库实现的一种强有力的嵌入式关系数据库管理体制。它提供了对SQL92的大多数支持:支持多表和索引、事务、视图、触发和一系列的用户接口及驱动,适用于任何操作系统d在2006年10月9日SQLite已经发行了版本3.3.8,增加了全文搜索的功能。

2、SQLite的特点

SQLite实现了完备的、可嵌入的、零配置的SQL数据库引擎。它的特点包括:

(1)事务处理是原子的、一致的、独立的和持久的(ACID),即使在系统崩溃和掉电以后。

(2)零配置,即不需要设置和管理。

(3)实现了绝大部分的SQL92标准。

(4)一个单独的磁盘文件存储一个完整的数据库。

(5)数据库文件在机器之间可自由共享q

(6)支持数据库文件大小至2TB。

(7)字符串和BLOG的大小只受限于可用存储器容量。

(8)代码量小i即小于30K的C代码行和小于250K的代码空间(gcc在1486上)。

(9)对于绝大多数普通操作来说,比流行的C/S模式的数据库引擎运行速度快。

(10) API简单、易用。

可以看出,基于以上特点,SQLite非常适合应用于嵌入式开发。,SQLite的版权允许无任何限制的应用,包括商业性的产品。

3、SQLite的体系结构

SQLite体系结构如图1所示。主要由以下几个主要的子系统组成:接口(Interface)是一个G语言库,从接口接收到命令后传到编译器,编译器是由三个独立的步骤组成:标志处理器(To-kenizer)、分析器(Parser)、代码生成器(Code Generator)。

SQLite嵌入式数据库如何加密

虚拟机( Virtual Machine)是为操作数据库文件而执行的一个抽象的计算机引擎。在虚拟机和低层存储、恢复程序之间,SQLite使用了一个抽象层执行B-树,页面缓冲(Pager),和操作 系统接口(OS Interface),最后是一个存储数据的数据库。

二、SQLite的加密方法分析

SQLite是一款轻型的数据库,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它学由于SQLite具有其他的优势,还广泛应用在非嵌入式领域。例如PHP5开始不再默认支持Mysql,而是默认支持SQLite。

SQLite在广泛应用的同时;对于数据库的安全也要提供足够的保障。SQLite在Windows中使用了巧妙而且有效的加密方法来保障数据的安全性。

1、加密原理

在对Windows API进行熟悉以后可以知道使用Microsoft提供的加密应用程序接口(即Cryptography API),或称CryptoAPI,可以方便地在应用程序中加入强大的加密功能,而不必考虑基本的算法。SQLite就是使用这个技巧,在Windows下为数据库提供了安全保障。

CryptoAPI本质上是一组函数,这些函数为程序员提供一个访问加密算法的接口鼠这个接口经过操作系统,最终由底层的CSP实现。CSP( CryptographicServiceProviders),即加密服务提供者(模块),是实现真正的加密服务的独立的模块。

Microsoft通过捆绑RSABaseProvider在操作系统级提供一个CSP,即RSA公司的公钥加密算法:根据需要,更多的CSP可以增加到应用中。现在国内已有一些公司提供兼容Cryp-toAPI的硬件设备,如全典网络(iSecureX. com)的UKey300型USB接口的电子钥匙,iSecureX CSP工具箱,都得到了微软的数字签名。

应用CryptoAPI,可以通过简单的函数调用来加密数据,交换公钥,计算一个消息的摘要以及生成数字签名等等。它还提供高级的管理操作,如从一组可能的CSP中选用一个CSPp;此外,CryptoAPI还为许多高级安全性服务提供了基础,包括用于电子商务的SET、用于加密客户机服务器消息的PCT、用于在各个平台之间来回传递机密数据和密钥的PFX、数字签名等等。

CryptoAPI的体系结构如图2所示。

SQLite嵌入式数据库如何加密

目前支持CryptoAPI的Windows系统有:Windows 95 0SR2、Windows NT SP3及后续版本、Windows 98、Windows 2000等。

2、加密实现

在分析SQLite的源码和接口以后,我们发现SQLite有sqlite3_key和sqlite3_rekey的接口。由于SQLite开放源码,所以可以对其进行修改,这样利用CryptoAPI可以很方便地实现对数据库的加密。

下面分别对数据库的加密过程实现进行描述:

(1)首先打开数据库Q使用函数sqlite3 _open( FileRoot,&db)打开数据库,将信息返回到db中,db是sqlite3的类。

(2)对数据库进行加密q使用函数intsqlite3_key(sqlite3*db,const void*pKey,int nKey)实现。*db指向要加密的数据库,*pKey指向加密的密码,是个字符串,nKey是密码的长度。

(3)在完成加密后关闭数据库。使用sqlite3_close(db)函数来实现。

以上是对一个全新的SQLite数据库进行加密的过程。在使用数据库时牵涉到其他方面的操作,参照表1可以知道操作的相应步骤。

SQLite嵌入式数据库如何加密

为了说明,从实现的加密工程中取了一段代码说明问题:

sqlite3*db; ∥定义数据库db

char*zErrMsg=0;

char FileRoot[256];

sqlite3_open( FileRoot, &ab);//打开数据库

if( db==NULL)//判断是不是打开成功

{

retum -1;

}

sqlite3_key( db ,"la2b3c4d",8);//执行加密

sqlite3_exec( db, "CREATE TABLE person( ID varchar( 18) UNIQUE,name varchar(20));",0.0,&zErrMsg);秒执行建表操作

sqlite3_prepare( db, tlinsert into list values( '310101 198401250000';'leo');”,-1.&stat ,0);//执行插入操作

//sqlite3_rekey( db,””,0);//更改密码操作

sqlite3_close( db);//删除密码操作

虽然只是一个sqlite3_key函数完成了加密的操作,但对于加密的过程,值得进行深入的研究。如图3所示,利用逐步挖掘的图来演示,加密算法的实现嵌套了多层函数。

SQLite嵌入式数据库如何加密

3、安全性分析

由于CryptoAPI已经广泛地应用于Windows平台上的各种加密服务,例如利用CryptoAPI实现的电子签名业务、网络信息加密等。在使用嵌入式数据库SQLite的场合,Cry ptoAPI提供的加密程度已经满足使用需要a、这是由CryptoAPI提供的完善的加密机制实现的。

CryptoAPI提供的加密体制是RSA公司的公钥加密算法争RSA公钥加密算法是由Ron Rivest,Adi Shamir和LeonardAdle-man于1977年发明的一种运算法则,它是一个网络加密和提供认证的系统。从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,被普遍认为是目前最优秀的公钥方案之。RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价。即RSA的重大缺陷是无法从理论上把握它的保密性能如何,而且密码学界多数人士倾向于因子分解不是NPC问题。

三、SQLite和Access的安全性比较

由于嵌入式数据库SQLite在WEB中的应用与Access数据库功能相似,所以在这里将Web开发中使用SQLite的安全性同Access相比较来证明SQLite在使用中的安全性。

实验环境:Windows XP,IE6.0,网速lOmbps。

实验内容:比较网站中SQIAte数据库与Access数据库的安全性。

实验结果参见表2(时间单位为秒)。

SQLite嵌入式数据库如何加密

SQLite在Web开发中的安全性比常用的Access要可靠,当然和大型DBMS例如Oracle、IBMDB2等相比,存在着较大的差距。但毕竟SQLite是一个小规模的数据库,能够实现这样的安全性实属不易。

四、SQLite的总结和前景

实现对SQLite数据库的加密是为推广SQLite的重要前提,也是完善一个数据库的重要方面。由于性能良好、资源占用少和零管理成本,再加上安全保障,嵌入式数据库SQLite有了用武之地,它将为那些以前无法提供用作持久数据的后端数据库的应用程序提供了高效的性能。基于SQLite的一些模块也发展起来,如PySQLite、SQLiteAnalyzer、sQLiteDB,这些模块的出现将更好地发挥SQLite的优良性能。

小知识之C库

一般是指编译器提供的可在c源程序中调用的函数。可分为两类,一类是c语言标准规定的库函数,一类是编译器特定的库函数。