51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

VC++下的sqlite数据库加密

SQLite数据库的C/C++使用请参阅 https://www.leavesongs.com/tag/sqlite


我发现我的报告和其他人比略显低端......这里使用AES加密sqlite数据库,但加密的代码看不懂,只知道怎么用......

SQLite开源的代码里没有实现加密的功能,但是在头文件中声明了sqlite3_key和sqlite3_rekey两个函数,实现这两个函数即可加密数据库。直接让数据暴露在notepad下让我一直耿耿于怀。但鉴于水平太臭,没得法,又找了个开源的项目,它把sqlite的加密实现了。
http://sourceforge.net/projects/wxcode/files/Components/
下面有个wxSQLITE3,这就是实现了加密的sqlite的源码。下载下来在sqlite3\secure里面有AES256和128位加密的版本。我直接取出AES256版本中的sqlite3.dll和sqlite3.lib。
拷贝到我使用sqlite的工程目录下,动态链接库怎么用这个就怎么用。

使用加密功能前先定义一下SQLITE_HAS_CODEC,大家读sqlite3.h就知道为什么了。定义如下(请放在所有代码的最前面,至少放在#include "sqlite3.h"前面):

#ifndef SQLITE_HAS_CODEC

#define SQLITE_HAS_CODEC

#endif


只具体讲一下加密的函数:
SQLITE_API int sqlite3_key( sqlite3 *db, /* Database to be rekeyed */ const void *pKey, int nKey /* The key */ );
第一个参数是数据库句柄,第二个参数是密码,第三个参数是密码的长度。在sqlite3_open函数后调用,也就是打开数据库以后调用。
1.如果原数据库没有加密,调用此函数则加密数据库。
2.如果原数据库已加密,此函数相当于一个"钥匙",打开数据库后,不调用此函数或密码不正确就不能操作数据库。

这里说一下,实践证明,欲加密数据库,在建立表之前请调用此函数。也就是说最好把该语句就放在sqlite3_open后面。否则可能加密不成。

还要说明一下,如果已调用sqlite3_close关闭了数据库,再次打开时,还是要调用sqlite3_key,此时相当于功能2.

最后说明一下,加了密的数据库操作和没加密一样。也就是说你只需要把sqlite3_key函数加到代码里,其他的什么都不用改。

另一个函数:

SQLITE_API int sqlite3_rekey( sqlite3 *db, /* Database to be rekeyed */ const void *pKey, int nKey /* The new key */ );

参数说明和刚才一样,作用是更改密码。很简单就不多说了。不过打开一个加密的数据库,先要调用sqlite3_key,再才能用sqlite3_rekey改密码。相当于要输入原密码才能修改密码,否则不会成功。

还有,如果第二个参数或第三个参数为NULL(0),则是删除密码,也就是解密。


演示:

一个数据库文件不加密前,用Notepad++打开,可以看到数据和sql语句:

点击查看原图{#ematt:95}

加密后,乱码了:

点击查看原图{#ematt:96}

其他一切使用正常:

点击查看原图{#ematt:97}


如果大家有心,可以去读读代码,看看加密的过程具体是怎么实现。

赞(3)
未经允许不得转载:工具盒子 » VC++下的sqlite数据库加密