分类:
2010-07-18 01:59:18
是非常优秀的跨平台数据库引擎。与最常见的需要服务进程的数据库引擎(如 )不同,SQLite 引擎不是独立的,而是与主程序编译在一起、并运行在同一个进程空间中的代码。数据的存取则是通过程序内直接调用其 实现的,整个数据库都在宿主主机上存储在一个单一的文件中。这些使得 SQLite 在读写效率、消耗总量、延迟时间和整体简单性上具有很大的优越性。
最为重要的的是,整个 SQLite 引擎是一个相对小规模的轻量级 C 语言库。理论上说,任何平台,只要有 C 语言编译器,SQLite 就能够移植到该平台上。又由于其轻量性,SQLite 成为了处理器性能、内存容量上都相对有限的嵌入式平台数据库的最佳解决方案(如 Google 的开源手机平台 );同时也是中小规模 系统数据库的良好解决方案;当然,PC 上的软件,也大量的采用了 SQLite (如 )。
不过,SQLite 有一个致命的缺点:免费版并不能对数据库进行加密。也就是说,这个存储于本地的数据库文件,如果用任何文本编辑器打开,数据内容便一览无余……相当的可怕吧,想想如果使用未加密的 SQLite 来存储数据,各位用户的密码那就是垂手可得啦,哈哈哈,说不准你就使用的跟银行帐户一样的密码。不过呢站长 Tim 是非常负责滴, 是非常强大滴,密码在存入数据库之前已经通过 WordPress 程序经过不可逆加密,就算能看到这些密码,也是一堆乱七八糟的东西。
作为一个著名的开源项目和著名的数据库,SQLite 的作者不可能没有想到数据加密的问题。其实作者只是留下了接口sqlite3_key而没有实现,这也给使用者更大的空间来用自己需要的算法加密数据。
密码学是一个庞大复杂的学科,普通的数据库开发者不可能为了加密 SQLite 而耗费大量时间去学习这门学科,我们只需要在sqlite3_key接口中调用一些加密API即可(如OpenSSL)。如果你是Windows开发人员,你也可以使用.net提供的加密函数。这样虽然免去了自己编译、学习OpenSSL的麻烦,不过也使得 SQLite 失去了跨平台的优势。
这里, 要介绍的是 上的一个开源项目 ,这一个兼具易用性和可移植性的 SQLite 加密解决方案。作者采用了比日益衰老的 更为先进的使用 Rijndael 算法的 ()实现了 SQLite 的加密接口。下面就开始编译加密 SQLite 库前的准备工作吧。
准备工作就绪后,解开 wxSQLite3 的源码包你可以看到sqlite3子目录,这个目录下现有的代码就是对 SQLite 加密接口的 Rijndael 算法实现。将这些代码编译进入 SQLite 库,你有两种选择:
注意:这两种选择,在您最后一道编译时,切记都要在编译参数中开启SQLITE_HAS_CODEC的宏定义,否则即使你调用了sqlite3_key,数据库也得不到加密!
到这里,你就可以在你的程序中使用这个 AES 加密的 SQLite 库了。加密您的数据库的方法,就是在打开的数据库后,在进行读写操作前,用自己指定的密匙调用 SQLite 的加密函数:
[cc lang="c"]sqlite3_key(pdb, “XLRW”, 4);[/cc]
其中,pdb是刚刚打开的数据库的指针,XLRW是密匙,4代表密匙长度。这时候,你再用文本编辑器打开 SQLite 的数据库文件,那就是一本天书啦。
最后还是要提一下 wxSQLite3 到底是什么。其实 wxSQLite3 是一个 SQLite 的 C++ warpper,只是它只是顺带将 SQLite 的加密函数实现了。如果你是一个 C++ 开发者,又喜欢使用 STL 的迭代器模式进行数据访问,那么接下来,推荐你通过链接刚刚编译好的加密 SQLite 库,来编译以 C++ STL 迭代器方式访问 SQLite 数据库的 wxSQLite3 库。wxSQLite3的源代码是 src\wxsqlite3.cpp 。具体如何编译,笔者就不再赘述。
文章作者: 原始站点: 原文标题:为跨平台数据库引擎 SQLite 实现加密扩展 发表日期:2009年07月12日 |