SQLite 3.7.13的加密解密(七)—— 遗留问题

摘要: 现象与原因采用上面的方法对数据库进行加密,存在页面尺寸错乱的问题。在SQLite的DB文件中,第16、17两个字节的值表示数据库中每个页的大小,SQLite规定页大小必须是512的倍数,如果加密算法恰好导致这两个字节的值为512的倍数,且与数据库的实际页面大小不一样,就会导致不能进行数据库操作。其原因是在sqlite3_open()函数中,会读取DB文件头,从16、17字节得到页大小,但是sqlite3_open()函数中没有调用解密函数,因此得到的就是错误的值。一般来说,采用的加密算法不会导致16、17这两个字节恰好是512的倍数,在SQLite内部有保护,如果这个数据不是512的倍数,或者 阅读全文
posted @ 2012-10-30 14:10 几百人有爱 阅读(339) 评论(0) 推荐(0)

SQLite 3.7.13的加密解密(六)—— 使用方法

摘要: 采用上一节的方法为SQLite添加了加密解密功能后,使用方法如下:1、在调用sqlite3_open()函数打开数据库后,要调用sqlite3_key()函数为数据库设置密码;2、如果数据库之前有密码,则调用sqlite3_key()函数设置正确密码才能正常工作;3、如果一个数据库之前没有密码,且已经有数据,则不能再为其设置密码;4、如果要修改密码,则需要在第一步操作后,调用sqlite3_rekey()函数设置新的密码;5、设置了密码的SQLite数据库,无法使用第三方工具打开;具体使用的示例代码如下:#include#include#include"sqlite3.h" 阅读全文
posted @ 2012-10-30 14:09 几百人有爱 阅读(1943) 评论(0) 推荐(0)

SQLite 3.7.13的加密解密(五)—— 修正编译错误和警告

摘要: 上面的代码是从网上下载下来的,它使用的SQLite版本比较旧,因此在SQLite 3.7.13下编译不通过,下面需要对编译错误和警告逐一修正。编译信息原因与修改方法'Pager' has no member named 'pCodecArg'在3.7.13版本中,Pager的成员变量pCodecArg名称修改为pCodec,因此用到pCodecArg变量的地方修改为使用pCodec。too few arguments to function 'sqlite3PagerPagecount'原来sqlite3PagerPagecount()函数用返回 阅读全文
posted @ 2012-10-30 14:07 几百人有爱 阅读(422) 评论(0) 推荐(0)

SQLite 3.7.13的加密解密(四)—— 挂接加密解密函数

摘要: 把crypt.c中实现的加密解密函数挂接到sqlite3.c中,并且实现前面编译提示的未实现的函数。在sqlite3.c的最后一行的后面,添加如下代码:#ifdefSQLITE_HAS_CODEC#include"crypt.h"/***加密结构***/#defineCRYPT_OFFSET 8typedefstruct_CryptBlock {BYTE* ReadKey; // 读数据库和写入事务的密钥BYTE* WriteKey; // 写入数据库的密钥intPageSize; // 页的大小BYTE* Data;} CryptBlock, *LPCryptBlock; 阅读全文
posted @ 2012-10-30 14:06 几百人有爱 阅读(675) 评论(0) 推荐(0)

SQLite 3.7.13的加密解密(三)—— 创建加密解密函数

摘要: 先不用管上面的编译错误,创建crypt.c和crypt.h,用来实现加密解密函数和相应接口的定义。crypt.c里实现了加密解密函数,代码如下:#include"crypt.h"#include"memory.h"/***********关键加密函数***********/intMy_Encrypt_Func(unsignedchar* pData,unsignedintdata_len,unsignedchar* key,unsignedintlen_of_key){unsignedinti;unsignedcharbit, val;for(i = 0 阅读全文
posted @ 2012-10-30 14:06 几百人有爱 阅读(411) 评论(0) 推荐(0)

SQLite 3.7.13的加密解密(二)—— 开放宏定义

摘要: 首先要在sqlite3.c中最前面,添加代码(网上有说在sqlite3.h中添加也可,实际测试在sqlite3.h中打开该宏是无效的):#ifndefSQLITE_HAS_CODEC#defineSQLITE_HAS_CODEC#endif这个宏是用来确定是否支持加密的。添加上述代码后编译,会出现如下错误:D:\Research\MySQLite\Debug/../src/sqlite3.c:80963: undefined reference to `sqlite3CodecAttach'D:\Research\MySQLite\Debug/../src/sqlite3.c:8096 阅读全文
posted @ 2012-10-30 14:05 几百人有爱 阅读(446) 评论(0) 推荐(0)

SQLite 3.7.13的加密解密(一)—— 前言

摘要: SQLite数据库支持加密和解密,但是免费版没有这个功能,不过网上已经有相关的资料,不过这些资料都不是基于SQLite 3.7.13版本的,这里根据网上找到的最全的资料进行整理,实现了SQLite 3.7.13版数据库的加密解密。本系列文章对此进行了详细说明。开发环境:操作系统Win 7IDEEclipse Juno (4.2) CDT编译器MinGW GCC 4.6.2SQLite3.7.13本文出自 “rainman” 博客,请务必保留此出处http://lancelot.blog.51cto.com/393579/940805来源:http://lancelot.blog.51cto.c 阅读全文
posted @ 2012-10-30 14:04 几百人有爱 阅读(266) 评论(0) 推荐(0)

Sqlite xxteacrypt.c代码

摘要: http://bbs.2ccc.com/topic.asp?topicid=337891今天刚好改风铃兄的sqlite,随便说说,不对的请大家指正.sqlite3PagerSetCodec变化非常大staticvoidsqlite3PagerSetCodec(Pager*pPager,void*(*xCodec)(void*,void*,Pgno,int),void(*xCodecSizeChng)(void*,int,int),//新加的void(*xCodecFree)(void*),//新加的void*pCodec//对应原来的pCodecArgxCodecSizeChng更改page大 阅读全文
posted @ 2012-10-30 10:55 几百人有爱 阅读(321) 评论(0) 推荐(0)

SQLITE3 使用总结

摘要: http://www.sqlite.com.cn/MySqlite/6/407.Html前序:一、版本二、基本编译三、SQLITE操作入门(1)基本流程(2)SQL语句操作(3)操作二进制(4)事务处理四、给数据库加密五、后记前序:Sqlite3的确很好用。小巧、速度快。但是因为非微软的产品,帮助文档总觉得不够。这些天再次研究它,又有一些收获,这里把我对sqlite3的研究列出来,以备忘记。这里要注明,我是一个跨平台专注者,并不喜欢只用windows平台。我以前的工作就是为unix平台写代码。下面我所写的东西,虽然没有验证,但是我已尽量不使用任何windows的东西,只使用标准C或标准C++。 阅读全文
posted @ 2012-10-30 09:52 几百人有爱 阅读(302) 评论(0) 推荐(0)

董淳光之SQLITE3 使用总结(3)

摘要: http://www.sqlite.com.cn/MySqlite/6/409.Html4.事务处理sqlite是支持事务处理的。如果你知道你要同步删除很多数据,不仿把它们做成一个统一的事务。通常一次sqlite3_exec就是一次事务,如果你要删除1万条数据,sqlite就做了1万次:开始新事务->删除一条数据->提交事务->开始新事务->…的过程。这个操作是很慢的。因为时间都花在了开始事务、提交事务上。你可以把这些同类操作做成一个事务,这样如果操作错误,还能够回滚事务。事务的操作没有特别的接口函数,它就是一个普通的sql语句而已:分别如下:int result;re 阅读全文
posted @ 2012-10-30 09:46 几百人有爱 阅读(237) 评论(0) 推荐(0)

董淳光之SQLITE3 使用总结(4)

摘要: http://www.sqlite.com.cn/MySqlite/6/410.Html/***下面是编译时提示缺少的函数***//**这个函数不需要做任何处理,获取密钥的部分在下面DeriveKey函数里实现**/voidsqlite3CodecGetKey(sqlite3* db,intnDB,void** Key,int* nKey){return;}/*被sqlite和sqlite3_key_interop调用,附加密钥到数据库.*/intsqlite3CodecAttach(sqlite3 *db,intnDb,constvoid*pKey,intnKeyLen);/**这个函数好像 阅读全文
posted @ 2012-10-30 09:41 几百人有爱 阅读(296) 评论(0) 推荐(0)