为跨平台数据库引擎 SQLite 实现加密扩展《转》

SQLite 简介

SQLite 是非常优秀的跨平台数据库引擎。与最常见的需要服务进程的数据库引擎(如 MySQL )不同,SQLite 引擎不是独立的进程,而是与主程序编译在一起、并运行在同一个进程空间中的代码。数据的存取则是通过程序内直接调用其 API 实现的,整个数据库都在宿主主机上存储在一个单一的文件中。这些使得 SQLite 在读写效率、消耗总量、延迟时间和整体简单性上具有很大的优越性。

最为重要的的是,整个 SQLite 引擎是一个相对小规模的轻量级 C 语言库。理论上说,任何平台,只要有 C 语言编译器,SQLite 就能够移植到该平台上。又由于其轻量性,SQLite 成为了处理器性能、内存容量上都相对有限的嵌入式平台数据库的最佳解决方案(如 Google 的开源手机平台 Android);同时也是中小规模 CMS 系统数据库的良好解决方案;当然,PC 上的软件,也大量的采用了 SQLite (如 Firefox)。

不过,SQLite 有一个致命的缺点:免费版并不能对数据库进行加密。也就是说,这个存储于本地的数据库文件,如果用任何文本编辑器打开,数据内容便一览无余……相当的可怕吧,想想如果嘻来嚷往使用未加密的 SQLite 来存储数据,各位用户的密码那就是垂手可得啦,哈哈哈,说不准你就使用的跟银行帐户一样的密码。不过呢站长 Tim 是非常负责滴,WordPress 是非常强大滴,密码在存入数据库之前已经通过 WordPress 程序经过不可逆加密,就算能看到这些密码,也是一堆乱七八糟的东西。

给 SQLite 上把锁

作为一个著名的开源项目和著名的数据库,SQLite 的作者不可能没有想到数据加密的问题。其实作者只是留下了接口sqlite3_key而没有实现,这也给使用者更大的空间来用自己需要的算法加密数据。

密码学是一个庞大复杂的学科,普通的数据库开发者不可能为了加密 SQLite 而耗费大量时间去学习这门学科,我们只需要在sqlite3_key接口中调用一些加密API即可(如OpenSSL)。如果你是Windows开发人员,你也可以使用.net提供的加密函数。这样虽然免去了自己编译、学习OpenSSL的麻烦,不过也使得 SQLite 失去了跨平台的优势。

这里,Tim 要介绍的是 SourceForge 上的一个开源项目 wxSQLite3,这一个兼具易用性和可移植性的 SQLite 加密解决方案。作者采用了比日益衰老的 DES 更为先进的使用 Rijndael 算法的 AES退出 DES,进入 Rijndael)实现了 SQLite 的加密接口。下面就开始编译加密 SQLite 库前的准备工作吧。

  1. 首先,到SQLite 官方网站 – http://www.sqlite.org/download页面,下载 SQLite 源码:sqlite-source-x.zip(其中x代表当前的版本号)。注意:不要下载前面的sqlite-amalgamation-x.zip,这是把所有源文件合成单个C文件的源码包,wxSQLite 需要独立源文件的源码,否则你要修改 wxSQLite 源码才能编译成功;
  2. 接着,到wxSQLite 项目 – http://wxcode.SourceForge.net/components/wxsqlite3/主页下载 wxSQLite3 最新的release版本。

准备工作就绪后,解开 wxSQLite3 的源码包你可以看到sqlite3子目录,这个目录下现有的代码就是对 SQLite 加密接口的 Rijndael 算法实现。将这些代码编译进入 SQLite 库,你有两种选择:

注意:这两种选择,在您最后一道编译时,切记都要在编译参数中开启SQLITE_HAS_CODEC的宏定义,否则即使你调用了sqlite3_key,数据库也得不到加密!

  1. 动态链接 SQLite 库:首先解开 SQLite 源码包,用你所使用的平台的 C 编译器将 SQLite 编译成动态链接库。接着将编译好的库文件拷贝到 wxSQLite3 源码的 sqlite3/lib 目录,将 SQLite 的头文件拷贝至 sqlite3/include 目录。接着,在你的编译器的编译选项里加入对这些头文件的包含以及刚刚编译号的 SQLite 库的链接,继续编译 sqlite3\secure\src\codec 下的代码。如果一切顺利,一个动态链接的 AES 加密 SQLite 引擎库就产生了。
  2. 静态链接 SQLite 库:同动态链接,先把 SQLite 的头文件拷贝至sqlite3/include 目录,接着将 SQLite 的c文件拷贝至sqlite3/secure/src。接着你需要自己编写makefile,设置宏USE_DYNAMIC_SQLITE3_LOAD的值为0,最后编译包括 sqlite3\secure\src\codec 中的所有代码。一切顺利,一个静态的 AES 加密 SQLite 引擎库就产生了。

到这里,你就可以在你的程序中使用这个 AES 加密的 SQLite 库了。加密您的数据库的方法,就是在打开的数据库后,在进行读写操作前,用自己指定的密匙调用 SQLite 的加密函数:

sqlite3_key(pdb, "XLRW", 4);

其中,pdb是刚刚打开的数据库的指针,XLRW是密匙,4代表密匙长度。这时候,你再用文本编辑器打开 SQLite 的数据库文件,那就是一本天书啦。

编译 SQLite 的 C++ warpper – wxSQLite3

最后还是要提一下 wxSQLite3 到底是什么。其实 wxSQLite3 是一个 SQLite 的 C++ warpper,只是它只是顺带将 SQLite 的加密函数实现了。如果你是一个 C++ 开发者,又喜欢使用 STL 的迭代器模式进行数据访问,那么接下来,推荐你通过链接刚刚编译好的加密 SQLite 库,来编译以 C++ STL 迭代器方式访问 SQLite 数据库的 wxSQLite3 库。wxSQLite3的源代码是 src\wxsqlite3.cpp 。具体如何编译,笔者就不再赘述。

原文地址:http://xirang.us/2009/07/encrypt-sqlite/


原文地址:https://www.cnblogs.com/iapp/p/3631775.html