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

来源:互联网 发布:淘宝网络兼职平台 编辑:程序博客网 时间:2024/05/20 23:14

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/


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 路由器的上网账号和口令忘了怎么办 小米笔记本移动热点连接不上怎么办 移动宽带密码重置后认证失败怎么办 移动光纤不记得账号和密码怎么办? 宽带为什么交了钱还是不能用怎么办 小孩被虎牙直播诱导支付了款怎么办 房间里4g网络信号差怎么办 移动4g网络信号不满格怎么办 大风号无法上传视频暂停服务怎么办 过了竞牌保证金交付时间怎么办 亚马逊产品上架后货物没到怎么办 工行企业网银证书过期了怎么办 海淘转运地址国家填错了怎么办 集装箱实重与申报重量不一样怎么办 微博复制的淘口令找不到了怎么办 买了移动手机不能用联通卡怎么办 移动手机用联通卡网速慢怎么办 移动手机插联通卡没反应怎么办 移动手机办了联通大王卡怎么办 qq被冻结但是有至尊宝怎么办 qq被冻结了有至尊宝怎么办 移动电话卡注销了里面的钱怎么办 罗麦的oa上经理喜报没截图怎么办 工行融e联登录密码忘了怎么办 融e借有额度秒拒怎么办 工行银行柜台办理融e借怎么办 地球末日生存破解版金币没了怎么办 手机被别人骗走了里面的微信怎么办 在微信里面被做微商的骗了钱怎么办 在qq上骗了人50怎么办 被3m多酶清洗液滴到皮肤怎么办 做3m赔了9万怎么办 在携程网上订的酒店发票怎么办 滴滴滴取消订单电话打不通怎么办 百度云容量2068g满了怎么办 淘宝电脑端描述图片间隔大怎么办 手机上下载游戏自动扣费怎么办 苹果手机下载游戏自动扣费怎么办 用手机账号登陆游戏换手机怎么办 在qq上被骗充q币怎么办 微信借钱后删了好友怎么办