SQLite加密 wxSqlite3

一直在网上搜wxSqlite3的文档,但是总找不到能真正解决问题的,就是一个简单的编译wxSqlite3自带的示例也出了老多问题,后来却发现,其实wxSqlite3的readme中已经有了详细的方法,哦,就在眼皮子底下!为了避免再一次的遗忘,就在这里暂作一个记录吧。

截至记录时间,wxSqlite3的版本号为2.1.1,Sqlite3的版本为3.7.6.2,这两个都可以直接在网上下载,

wxSqlite3的站点http://wxcode.sourceforge.net/components/wxsqlite3

http://sourceforge.net/projects/wxcode/files/Components/wxSQLite3/

http://sourceforge.net/projects/wxsqlite/?source=directory

Sqlite3的站点http://www.sqlite.org/

其中wxSqlite3自带了已编译的Sqlite3.7.6.1的DLL,当然,我的目的是自己编译静态的Lib,所以只能自己下来重新编译了。当然,我要的Lib是要带加密功能的,呵呵。

 

wxSQLite3 is a C++ wrapper around the public domain SQLite 3.x database and is specifically designed for use in programs based on the wxWidgets library.

wxSQLite3 does not try to hide the underlying database, in contrary almost all special features of the current SQLite version 3.7.10 are supported, like for example the creation of user defined scalar or aggregate functions. Since SQLite stores strings in UTF-8 encoding, the wxSQLite3 methods provide automatic conversion between wxStrings and UTF-8 strings. This works best for the Unicode builds of wxWidgets. In ANSI builds the current locale conversion object (wxConvCurrent) is used for conversion to/from UTF-8. Special care has to be taken if external administration tools are used to modify the database contents, since not all of these tools operate in Unicode resp. UTF-8 mode.

Since version 1.7.0 optional support for key based database encryption (128 bit AES) is also included. Starting with version 1.9.6 of wxSQLite3 the encryption extension is compatible with the SQLite amalgamation source and includes the extension functions module. Support for 256 bit AES encryption has been added in version 1.9.8.
从wxSqlite3 1.9.6开始,它的加密扩展就已经从C++转为纯C语言实现,因此现在可以直接编译SQLite amalgamation source distribution实现了。只需要编译文件sqlite3secure.c即可,其已经include了所有需要的源文件。当然C++版本的文件也在codec目录(\sqlite3\secure\src\codec-c)中,但作者强烈的不推荐用它。

唠了这么多,现在正式开始。

  1、下载sqlite-amalgamation-XXXXXX.zip,它已经包含了所有的源文件,也不需要另外的辅助工具了,解压到某一目录,如Sqlite3。

  2、如果你下的sqlite-amalgamation-XXXXXX.zip没有makefile,那就自己做一个project吧,在VS2008里新建一个空工程,只加入sqlite3secure.c文件到工程即可,修改其中的#include "sqlite.c"的sqlite.c文件路径为上一步解压的文件的路径。

  3、在配置属性中设置配置类型为静态库(.Lib),添加预处理 SQLITE_HAS_CODEC=1 CODEC_TYPE=CODEC_TYPE_AES128 SQLITE_CORE THREADSAFE SQLITE_SECURE_DELETE SQLITE_SOUNDEX SQLITE_ENABLE_COLUMN_METADATA

  4、编译生成Lib文件。 5、将生成的Lib文件取代wxsqlite3-2.1.1\sqlite3\lib中的sqlite3.lib文件,然后编译wxSqlite3为静态库,别忘了设置USE_DYNAMIC_SQLITE3_LOAD=0。

》》》》》》》》》》》》》》》》》》》》

Delphi使用wxsqlite加密Sqlite数据库
    提起桌面数据库,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参数设置为你的数据库密码,这样链接数据库后你 就可以随意操作了。       有时间再把这些东西整整,做个直接加密的工具,以后就能非常方便的加密自己的数据库了!

 

********************************************************************************************

SQLITE支持跨平台、跨语言,是做桌面产品比较合适的轻量级开源文件数据库,最新版本是3.7.15,下载位置:http://www.sqlite.org/sqlite-amalgamation-3071500.zip,非商业版本不提供加密功能,但有相应的第三方开源类库已经实现了加密功能。通常的方案是在C++下使用加密SQLITE库,.NET语言使用时进行封装,.NET下的SQLITE加密方式是不兼容的。 wxSQLite3除了封装SQLITE以外,还实现了一个SQLITE加密版本,wxSQLite3的最新版本是3.0.1,支持SQLITE 3.7.14.1。
首先下载wxSQLite3:http://sourceforge.net/projects/wxcode/files/Components/wxSQLite3/wxsqlite3-3.0.1.zip/download
解压后获取wxsqlite3-3.0.1\sqlite3\secure\src下所有文件。

新建C++ SDK DLL工程SQLITE3,加入预处理:
    SQLITE_HAS_CODEC=1
    CODEC_TYPE=CODEC_TYPE_AES128
    SQLITE_CORE
    THREADSAFE
    SQLITE_SECURE_DELETE
    SQLITE_SOUNDEX
    SQLITE_ENABLE_COLUMN_METADATA

只把sqlite3secure.c包含在工程中,不使用预编译头。

在sqlite3.c及sqlite3secure.c文件头部加入:

    #ifndef SQLITE_API
    #define SQLITE_API __declspec(dllexport)
    #endif
    
    #ifndef SQLITE_HAS_CODEC
    #define SQLITE_HAS_CODEC
    #endif
    
在sqlite3.h头部加入(根据使用方法不同,此步骤并非必要):
    #ifndef SQLITE_API
    #define SQLITE_API __declspec(dllimport)
    #endif
    
    #ifndef SQLITE_HAS_CODEC
    #define SQLITE_HAS_CODEC
    #endif

使用方引用sqlite3.h及sqlite3.lib
    
    int result=0;
    sqlite3 *db=NULL;       
    
    result=sqlite3_open("c:\test.db",&db);     
    result=sqlite3_key(db,"abcd",3); //使用密码,第一次为设置密码
    //result=sqlite3_rekey(db,NULL,0); //清空密码
    result=sqlite3_exec(db,"PRAGMA synchronous = OFF",0,0,0);    //提高性能
    result=sqlite3_exec(db,"PRAGMA cache_size = 8000",0,0,0); //加大缓存
    result=sqlite3_exec(db,"PRAGMA count_changes = 1",0,0,0); //返回改变记录数
    result=sqlite3_exec(db,"PRAGMA case_sensitive_like = 1",0,0,0); //支持中文LIKE查询
    
    result=sqlite3_exec(db,"CREATE TABLE [MyTable] ([ID] INTEGER PRIMARY KEY NOT NULL,[MyText] TEXT NULL)",0,0,0);

 

posted on 2015-01-13 18:05  &大飞  阅读(9541)  评论(0编辑  收藏  举报

导航