SQLite是一个很好用的单机数据库,体积小巧,支持大多数SQL 92语法,速度快,健壮,使用和分发都很简单。但是免费开源版并不提供加密功能,需要加密得购买原作者的一个插件,价格$2000!我们只好使用第三方的加密版本,这是被逼的。当然还有一个选择就是,在开源的C文件中已经预留了加密接口,有能力的可以自己去实现。
闲话休提。第三方的加密版本已经有人实现了,还不止一个。下面分别介绍一下:
※ SQLite原装版,http://www.sqlite.org/ 目前最新版本是3.6.10。但我们现在不使用它的DLL而用第三方,所以可以无视它了。需要源文件的可以去下载。
※ 第三方其一是用于.NET环境下的System.Data.SQLite.DLL。它是为了.NET开发的,不过也集成了原生SQLite.DLL,把它改名为sqlite3.dll,直接就可以拿来用了。因为使用了Windows的API来加密,所以不能跨平台,但是Delphi的程序本来就不能跨平台:)。目前版本1.0.60.0,无源文件,使用的SQLite版本应该是3.5.4。
文件:System.Data.SQLite.DLL(用时改名为sqlite3.dll)
大小:839680 B; MD5:4c42911e64bda2095434189ff8393519
链接地址: http://sqlite.phxsoftware.com/
※ 第二种实现是wxSQLite3。它是跨平台的wxWidgets 开源函数库的一部分,在Win32平台也工作得很好。使用MD5 + RC4 + 128位AES加密算法,提供cpp源文件。目前版本是1.9.4,使用的sqlite版本是3.6.10。☆推荐使用☆
文件:SQLite3.DLL,大小:532480 B,
MD5:70c3bbdc4b90aeb19b7381b514558558
链接地址:http://wxcode.sourceforge.net/components/wxsqlite3/
※ Delphi数据库控件ZeosLIB,是一个用来连接数据库的第三方开源控件包,据说是用来取代BDE的,确实好用,但据反映在一定情况下可能有内存泄漏问题。目前版本是6.6.4,支持ADO、ASA、FireBird、Interbase、MSSQL、MySQL、Oracle、Postgre SQL、SQLite、Sybase的各种版本,如SQLite2、SQLite3、FireBird 1.5、FireBird 2.0、FireBird嵌入版等等。☆大力推荐☆
地址:http://zeos.firmos.at/
下面终于可以开始进入正题了,在Delphi 7中如何调用SQLite的加密函数?
首先,安装Zeos控件包,把我们的支持加密的SQLite3.DLL文件copy到程序目录下。这里要跳出来说明一下的是,对于SQLite3加密函数的调用,在Zeos 6.6.2版本之前是不支持的,需要打个补丁才行,现在已经加入到最新的版本之中了。但是网上的调用说明是有问题滴,这也是为什么要写这个文档的原因。
在程序上放一个TZconnection,名为Zconnection1,设置连接数据库的参数,这些就不废话了。又跳出来一下:据说SQLite3是使用UTF8编码,所以如果数据库放在中文目录下,则调用路径必须进行编码转换才行;但是用Zeos连接SQLite,放在中文目录下都没问题。搞不好Zeos已经自动把编码搞定了?太贴心了。
1、打开加密的数据库
var
db: Pointer;
pwd: string;
i: integer;
begin
pwd := ‘xxxxxx’;
ZConnection1.Connected := true;
db := (ZConnection1.DbcConnection as IZSQLiteConnection).GetConnectionHandle;
i := (ZConnection1.DbcConnection as IZSQLiteConnection).GetPlainDriver.Key(db, PChar(pwd), Length(pwd));
………………
2、给未加密的数据库加密或修改密码
procedure RekeyDB(conn: TZConnection; pwd: string);
var
db: Pointer;
i: integer;
begin
db := (conn.DbcConnection as IZSQLiteConnection).GetConnectionHandle;
i := (conn.DbcConnection as IZSQLiteConnection).GetPlainDriver.ReKey
(db, PChar(pwd), Length(pwd));
If (i <> 0) then // 函数正常执行返回0,否则
begin
// xxxxxxx
end;;
end;
注:IZSQLiteConnection 的定义在ZDbcSqLite单元。
以上。最后要注意的就是对SQLite3.DLL的加密实现各不相同,DLL文件可是不能混用的。