SQLite加密技术

http://www.cnblogs.com/sunsoft/archive/2011/04/07/2008816.html

SQLite 3 开源版不带加密功能,对于一个保存在本地的数据库来说没有加密功能让人难以接受,只要用记事本打开数据库就可以看到数据库内保存的数据,对安全多多少少有一点影响。有一个办法是把内容加密后保存到数据库中,但遇到类似 like,或字段内容与字段内容比较这就不行了。治本的办法是让 SQLite 原生的支持加密。好在 SQLite 的作者预留了加密解密的相关接口,许多爱好者也自己修改源版添加加密功能。如果你也在关注,那你可能已经阅读了大量关于如何添加加密的文章,同时我也不是很通相关的技术,我就不再讲解如何修改源码了。虽然网上有大量的文章教你如何修改源码,但都没有提供编译后的 DLL 文件,或者提供的 DLL 版本过低。这里介绍一个开源项目:wxSQLite3,该项目是一个 SQLite 的 C++ warpper,它顺带将 SQLite 的加密函数实现了,并且它使用 AES 算法进行加密。你可以在http://sourceforge.net/projects/wxcode/files/Components/下载到最新的包,在目录 \sqlite3\secure 下你可以找到一个 sqlite3.dll 文件,这个就是已编译的带加密的 SQLite 3 DLL 文件,而且 wxSQLite3 项目更新很快,你总是可以下载到较新的包。在最新的1.9.8版本中开始对256位AES加密进行实验,估计不久的版本就可以稳定使用。

使用起来也很简单,首先打开数据库 sqlite3_open,然后在操作数据库之前执行 sqlite3_key 后就可进行数据库操作,否则会返回错误。

sqlite3_key是输入密钥,如果数据库已加密必须先执行此函数并输入正确密钥才能进行操作,如果数据库没有加密,执行此函数后进行数据库操作反而会出现“此数据库已加密或不是一个数据库文件”的错误。

int sqlite3_key( sqlite3 *db, const void *pKey, int nKey),db 是指定数据库,pKey 是密钥,nKey 是密钥长度。例:sqlite3_key( db, "abc", 3);

sqlite3_rekey是变更密钥或给没有加密的数据库添加密钥或清空密钥,变更密钥或清空密钥前必须先正确执行 sqlite3_key。在正确执行 sqlite3_rekey 之后在 sqlite3_close 关闭数据库之前可以正常操作数据库,不需要再执行 sqlite3_key。

int sqlite3_rekey( sqlite3 *db, const void *pKey, int nKey),参数同上。

清空密钥为 sqlite3_rekey( db, NULL, 0)。


http://www.cppblog.com/niewenlong/archive/2007/06/01/25263.html

      SQLite是一个非常小巧的跨平台嵌入式数据库,它的数据库以文件的形式存放在本地磁盘上,但是在其开源的免费版中它却缺少了一个数据库中几乎是必备的功能,那就是对于数据库的加密。SQLite的数据库文件可以被任何的文本编辑工具打开,从而获取到其中的数据,这一点令很多开发者感到不安。

 

但是其实SQLite是支持数据库加密的,前些天看到了网友arris的帖子,具体如下:

sqlite的源代码中原本就考虑了加密的实现,并且保留了接口sqlite3_keysqlite3_rekey,只是这两个函数在free版本中没有实现,但幸运的是,sqlite的源代码的代码是开放并允许修改,我们可以很方便的增加加密的实现。在http://www.sqlite.com.cn/POParticle/3/216.Html链接的的代码包中就包含有可加密sqlite的源代码的实现,我根据这个包编译了一个可加密的sqlite。这个包加密实现调用了windows API 的加密函数,所以只能在windows中使用。

 

这个可加密的版本是在一个ADO.NET 2.0 SQLite Data Provider的基础上改过来的(http://www.sqlite.com.cn/POParticle/3/216.Html),据原作者声称效率损失在千分之一以下。原始工程是基于VS2005的,但是考虑到其普及性还不是很广,所以重新建立了一个居于VC2003的工程。

 

其实SQLite的两个加密函数使用起来非常的简单,下面分情况说明:

     给一个未加密的数据库添加密码:如果想要添加密码,则可以在打开数据库文件之后,关闭数据库文件之前的任何时刻调用sqlite3_key函数即可,该函数有三个参数,其中第一个参数为数据库对象,第二个参数是要设定的密码,第三个是密码的长度。例如:sqlite3_key(db,"1q2w3e4r",8);        //给数据库设定密码1q2w3e4r

     读取一个加密数据库中的数据:完成这个任务依然十分简单,你只需要在打开数据库之后,再次调用一下sqlite3_key函数即可,例如,但数据库密码是123456时,你只需要在代码中加入sqlite3_key(db,"123456",6);

     更改数据库密码:首先你需要使用当前的密码正确的打开数据库,之后你可以调用sqlite3_rekey(db,"112233",6) 来更改数据库密码。

     删除密码:也就是把数据库恢复到明文状态。这时你仍然只需要调用sqlite3_rekey函数,并且把该函数的第二个参数置为NULL或者"",或者把第三个参数设为0

 

加密后数据库文件显示为乱码:

 

为此我建立了一个简单的示例:

    sqlite3 *db;

    sqlite3_stmt *stat;

    char *zErrMsg = 0;

    char temp[256], FileRoot[256];

    char buffer2[1024]="0";

 

    sprintf(temp, _T("%s"), _T("utf.db"));

    CCodingConv::GB2312_2_UTF8(FileRoot, 256, temp, 0);

    sqlite3_open(FileRoot, &db);

 

    if(db == NULL)

    {

        return -1;

    }

 

    sqlite3_key(db,"1q2w3e4r",8);

 

    sqlite3_exec(db, "CREATE TABLE list (fliename varchar(128) UNIQUE, fzip text);", 0, 0, &zErrMsg);

    sqlite3_prepare(db, "insert into list values ('中文GB2312编码',?);", -1, &stat, 0);

 

    strcpy(temp, "测试数据UTF-8的支持情况");

    int len = (int)strlen(temp);

 

    sqlite3_bind_text(stat, 1, temp, len, NULL);

    sqlite3_step(stat);

 

    sqlite3_prepare(db, "select * from list;", -1, &stat, 0);

    sqlite3_step(stat);

 

    const unsigned char * test = sqlite3_column_text(stat, 1);

    int size = sqlite3_column_bytes(stat, 1);

 

    printf("%s", test);

 

    sqlite3_finalize(stat);

    //sqlite3_rekey(db,"",0);

    sqlite3_close(db);

 

具体的源代码如下:

SQLite3.3.7 加密版源代码(VC2003

SQLite3.3.7 加密版源代码(VC2005


System.Data.SQLite 是一个原始SQLite的加强版.  它将是一个原版的sqlite3.dll完全替代品 (你甚至就可以把它重命名为sqlite3.dll).  它不需要链接.NET 运行时,所以可以脱离.NET独立发布然而它内嵌了一个完整的 ADO.NET 2.0 引擎,为开发提供了完整的支持.

以下是它的特性简介:

完整的 ADO.NET 2.0 实现
整个工程完全基于VS2005  ADO.NET 2.0全新构建使用了全部的ADO.NET framework新特性.  包括完整的 DbProviderFactory 支持自动的分布式事务调用广泛的模式支持,此外所有的类都是从 ADO.NET 2.0 的基类继承下来的.

支持完整和精简的 .NET Framework 以及 C/C++
这个库不需要链接依赖.NET运行时,100%兼容原始的sqlite3.dll,可以使用非托管的C/C++进行开发.

可移植的数据库文件
未加密的 SQLite 数据库文件可以自由的跨平台和处理器使用,包括非Windows平台加密之后的数据库可以在全部Windows平台上使用.

可以信赖的速度,比包括Sql Server Mobile 在内的其它大多数嵌入式数据库都要快速
SQLite'
安装所占用的空间相对于Sql Mobile可谓忽略不计了它在运行的时候占用更少的内存,同时生成的数据库也更小.

数据库加密
可以对整个数据库文件进行加密.  支持二进制和明文的密码.

支持使用Visual Studio 2005 设计
你可以向Server Explorer添加一个SQLite 连接使用查询设计器创建处查询语句向一个数据集中拖拽一个表格等等! SQLite的开发者可以在包括体验版在内的各种Visual Studio 2005下工作.

单文件再发布包容量在400kb以下
SQLite本身和ADO.NET 封装捆绑编译在一起.  预编译的二进制文件提供了 x86, IA64, x64 ARM 的版本.

广泛的SQL语言支持
SQLite 
支持大部分的SQL92 标准(see below).  支持命名和未命名的参数以 UTF-8UTF-16 编码通过优化的管道传入SQLite 内核.

用户自定义的函数 和 排序
全面支持用户自定义函数和排序方式,意味着你可以用自己喜欢的.NET语言来实现SQLite没有提供的特性.  这一切将非常的简单.

提供了全部的源代码.  100% 免费.
全部的封装库源代码都是公有的.  无论是个人还是商业应用都没有任何的协议约束.

下载源代码和二进制包

http://www.sqlite.com.cn/Upfiles/source/SQLite-1.0.31.0.rar



  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值