提起桌面数据库,Sqlite谁都知道,但对于它的加密一直困扰着很多人,而delphi的加密使用范例更少。在网上混了两天,查找了一些Sqlite加密的相关资料,也知道了wxsqlite这个东西,它是一个sqlite3.dll的嵌入扩展,重要的是里面加入了对Sqlite的AES 128bit-256bit加密扩展,而且用的是Sqlite预留的函数接口,这意味着什么呢?UniDAC从3.5.14版本以后加入了对encrypted sqlite的支持,这功能支持 SEE/CEROD这样使用预留接口开发的加密功能的第三方扩展,也就是说wxsqlite同样能被UniDAC所支持,这意味着你就不用再去改UniDAC的源代码了,wxsqlite可以在我这下载http://download.csdn.net/source/3215472
下面说说具体的使用方法,下载后你可以在sqlite3/secure目录下找到AES128和AES256两个文件夹,分别包含两种加密类型扩展的库文件,找到sqlite3.dll,然后放到你要调用的路径,然后下面是我随便Copy修改后的delphi的源码:
- unit main;
- interface
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, DB, MemDS, DBAccess;
- type
- TSQLiteDB = Pointer;
- Tsqlite3=Pointer;
- TForm4 = class(TForm)
- procedure FormCreate(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
- const
- {$IF Defined(MSWINDOWS)}
- SQLiteDLL = 'sqlite3.dll';
- {$ELSEIF Defined(DARWIN)}
- SQLiteDLL = 'libsqlite3.dylib';
- {$linklib libsqlite3}
- {$ELSEIF Defined(UNIX)}
- SQLiteDLL = 'sqlite3.so';
- {$IFEND}
- var
- Form4: TForm4;
- db: TSQLiteDB;
- function SQLite3_Open(filename: PAnsiChar; var db: TSQLiteDB): integer; cdecl; external SQLiteDLL name 'sqlite3_open';
- function sqlite3_key (
- pDb: Tsqlite3; // Database handle
- pKey: PAnsiChar; // Database PassWord (UTF-8)
- nKey: Integer // Database sizeofpassword
- ): integer; cdecl; external SQLiteDLL name 'sqlite3_key';
- function sqlite3_rekey (
- pDb: Tsqlite3; // Database handle
- pKey: PAnsiChar; // Database PassWord (UTF-8)
- nKey: Integer // Database sizeofpassword
- ): integer; cdecl; external SQLiteDLL name 'sqlite3_rekey';
- implementation
- {$R *.dfm}
- procedure TForm4.FormCreate(Sender: TObject);
- begin
- SQLite3_Open('ak.db',db); //打开数据库
- SQLite3_key(db,'cba',3); //设置密码
- SQLite3_rekey(db,'abc',3); //更改密码
- end;
- end.
不过我下载的最新版本的wxsqlite里已经编译好的sqlite3.dll中,sqlite3_key函数好像是空的,不起作用,后来查了查,是自己在使用UniDAC时直接链接了,所以我直接试着调用了sqlite3_rekey实现了对数据库的加密,加密后的数据库再用记事本打开时已经是乱码了,然后用数据库工具查看时会提示“数据库已经加密”。要更改密码的话首先得把所有多余的链接断掉,然后先Open数据库,再用sqlite3_key设置用来操作数据库的原密码,这样获得操作权之后就能用sqlite3_rekey设置新的密码了。
接下来说说UniDAC里怎么链接加密后的数据库。上面说了,UniDAC3.5.14以后的版本加入了Sqlite的encryption功能,所以在添加链接的时候你在specificOption项里可以将option项中的encryptionkey参数设置为你的数据库密码,这样链接数据库后你就可以随意操作了。
有时间再把这些东西整整,做个直接加密的工具,以后就能非常方便的加密自己的数据库了!