Sqlite China  
首页 | 各种语言的sqlite编程 | sqlite研究 |sqlite应用实例与杂谈 | sqlite相关下载 | SQlite论坛
当前位置 : 主页>sqlite研究>列表
SQLite 数据库加密的一种解决方案
来源:工友 作者:工友 时间:2007-12-21

    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

 

例子1例子2

(阅读次数:
上一篇:SQLite 3.x JDBC驱动 下一篇:Sqlite中文排序研究(1)
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]
用户名: 新注册) 密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
§最新评论
热点文章
·SQLite数据库的体系结构
·SQLite与其他数据库的速度
·SQL 语言参考资料
·SQLite语法备忘录
·sqlite 的相关调查1
·嵌入式数据库SQLite的一份
·SQLite在嵌入式Web服务器
·点评主流开源数据库的技术
·基于ARM-Linux的SQLite嵌
·SQLite与其他数据库的速度
·SQLite数据库编程--创建数
·SQL 语法手册
·SQLite Mode 数据库交互的
·SQLITE3 使用总结(3)
·XXTEA加密算法为SQLite 3.
·SQLite 第三版总览(简介)
·SQLite 第三版中的数据类
·用sqlite 执行标准 sql 语
·System.Data.Sqlite 上手
·SQLite编译安装步骤
相关文章
·SQLite Mode 数据库交互的
·SQL 语言参考资料
·SQLite在嵌入式Web服务器
·SQL 语法手册
·System.Data.Sqlite 上手
·SQLite数据库编程--创建数
·SQLite数据库编程--数据库
·SQLite在TorqueScript中的
·关于sqlite_exec回调函数
·用sqlite 执行标准 sql 语

版权Power by DedeCms   后台登陆
Copyright @ 2007