SQLiteSecure –SQLite的加密扩展方法

http://tech.ddvip.com   2008年02月19日    社区交流

关键字: SQLite

内容摘要:这篇文章专门介绍如何扩展当前正越来越流行SQLite的数据库的加密部分,。

  在我搜索了SQLite的邮件列表和在Google上搜索免费的SQLite插件或扩展之后,我发现没有能够满足我的需求的, 所以我决定自己写一个. 我从SQLite的作者预留的一些用来支持数据库加密解密的API接口获得了灵感,并且我发现实际上也有人写了一个基于SQLite的加密库(SQLcrypt). 我花费了几天的时间来研究一些加密的算法,我要选出一种使用(The AES (Rijndael) block cipher) ,另外还有就是如何生成密码, 当然最重要的就是我怎样才能把我用来完成加密解密数据库的代码嵌入SQLite的核心当中执行.

  扩展模块的技术说明书

  这个扩展模块的结构相当的简单. 大体上来说我编写了SQLite代码中已经提供了原型的四个函数: sqlite3_key(), sqlite3_rekey(), sqlite3CodecGetKey(), 和 sqlite3CodecAttach(). 前两个函数是在sqlite3.h头文件中定义的公共API. 另外两个定义在 attach.c 的sqlite3Attach()函数中. 我阅读了它的源代码中提供的函数原形(主要是 pager.c 和 btree.c两个文件),看一下它们是如何工作的. 我发现实现他们并不困难,因为对数据库加密解密的机制已经都实现了(感谢 Richard!).

  这个扩展的其他部分就是写一个用来加密和解密的程序. 为此我使用了AES加密算法,其中代码的关键部分取自Brian Gladman (his site) 还有David Ireland的高精度加密算法库BigDigits. 因为我不想在一开始的时候就跟SQLite的数据库格式过多的纠缠, 所以我用了计数器模式(CTR)把AES加密块转换成256字节的加密流. 这样加密之后的密文就可以和原来的明文有相同的长度,加密和没加密的数据库文件尺寸相同 (也就是说不需要保存而外的信息). 我还使用了Brian Gladman网站上提供的 PKCS#5签名的SHA256算法从用户提供的密码中来生成AES 算法的密钥. 如果是这样的话, 我就要写很多的代码来处理salt value 才能避免往数据库中存入额外的信息.

来源:豆豆网转载    责编:豆豆技术应用

正在加载评论...