2024年5月28日发(作者:)
让unidac支持加密的sqlite
sqlite是一款优秀的单文件数据库软件,只需一个dll就就完全包含数据库引擎
的功能,而且可以嵌入至其它程序中,完全不用额外的设定。其特性如下:
*支持ACID(Atomic,Consistent,Isolated,Durable)交易。
*零组态设定(Zero-configuration),无须管理者的设定及管理。
*支持大部分SQL92的语法。
*数据库存在于一个单一的文件中。
*数据库系统所在机器的字节顺序(Byteorder)无关。
*支援大小至2TB(2^41bytes)。
*极小的内存需求:小于3万行的C语言程序代码。小于250KB的程序空间。
*大部分的数据库操作皆快于一般流行的数据库系统。
*简单易用的API。
*支援TCL。也有其它语言的支持可用。
*注释详细的程序代码,以及超过90%的测试。
*链接库自己包含完整的功能,无须其它额外的程序或链接库。
*程序代码版权为publicdomain。任何用途皆可免费使用。
不过sqlite开源版是不支持加密的,只留有接口,没有进行实现,不过开源界从来
不缺乏雷锋,于是有了wxsqlite工程,wxsqlite是sqlite的wxWidgetsc++实现接
口,顺便用aes加密算法实现了sqlite的加密功能,与sqlite100%兼容,实在是赞!
我常用的数据库连接组件是unidac,最新的3.x版本已经支持sqlite,不过也没有
实现加密函数定义,于是自已动手帮它加上,我用的版本是3.0.0.6。
是调用接口定义
//functions下面加上以下代码:
_sqlite3_key=function(
pDb:Tsqlite3;//Databasehandle
pKey:PAnsiChar;//DatabasePassWord(UTF-8)
nKey:Integer//Databasesizeofpassword
):integer;{$IFNDEFCLR}cdecl;{$ENDIF}
_sqlite3_rekey=function(//Ifthecurrentdatabaseisnot
encrypted,==0ornNew==0,
thedatabaseisdecrypted.
pDb:Tsqlite3;//Databasehandle
pNew:PAnsiChar;//DatabaseNewPassWord(UTF-8)
nNew:Integer//Databasesizeofnewpassword
):integer;{$IFNDEFCLR}cdecl;{$ENDIF}
...........................
var下面加
sqlite3_key:_sqlite3_key;
sqlite3_rekey:_sqlite3_rekey;
........................................
procedureInitFunctions;
begin
{$IFDEFCLR}下面加
sqlite3_key:={$IFNDEF
UNIDACPRO}LiteCallCLR{$ELSE}LiteCallCLRUni{$ENDIF}.sqlite
3_key;
sqlite3_rekey:={$IFNDEF
UNIDACPRO}LiteCallCLR{$ELSE}LiteCallCLRUni{$ENDIF}.sqlite
3_rekey;
...................
{$ELSE}下面加
sqlite3_key:=GetProc('sqlite3_key');
sqlite3_rekey:=GetProc('sqlite3_rekey');
..................................
initialization
LockInit:=;
{$IFNDEFCLR}下面加
sqlite3_key:=@NotLink;
sqlite3_rekey:=@NotLink;
..................................
是引擎调用接口实现
Check(sqlite3_open(PAnsiChar(UTF8Encode(FDatabase)),
FSQLite));
下面加:
ifPos('ChangePassword',FUsername)=1then
begin
ifCopy(FUsername,16,Length(FUsername))<>''then
SQLite3_key(FSQLite,PAnsiChar(Copy(FUsername,16,Length(FU
sername))),SizeOf(FUsername));
ifFPassword<>''then
SQLite3_rekey(FSQLite,PAnsiChar(FPassword),SizeOf(FPasswo
rd));
end
elseifFUsername='ClearPassword'then
begin
ifFPassword<>''then
SQLite3_key(FSQLite,PAnsiChar(FPassword),SizeOf(FPassword)
);
SQLite3_rekey(FSQLite,0,0);
end
else
ifFPassword<>''then
Check(SQLite3_key(FSQLite,PAnsiChar(FPassword),SizeOf(FPa
ssword)));
测试加密,解密正常。


发布评论