sqlcipher开源项目的ubuntu编译和交叉编译

sqlcipher是一个对sqlite数据库进行aes256加密的开源库,其强大的跨平台性让它被许多知名企业使用,例如三星、摩托罗拉、苹果等等,从ios2-ios6苹果一直采用sqlcipher,安卓平台可以支持os2.x-os4.4.
项目本身不提供加密算法,调用openssl的aes加密算法,其官方称只要能使用sqlite、有openssl库的平台都可使用sqlcipher。

一、ubuntu下编译
1.编译依赖的openssl库
ftp://ftp.openssl.org/source下载zip安装包

解压源码到ubuntu下,进入openssl源码根目录
./config shared –prefix=/home/xxxxx
make && make install

在/home/xxxxx目录即生成了openssl的相关动态、静态库,将库拷贝到系统默认库目录
cp openssl/lib/* /usr/lib/

2.编译sqlcipher
https://github.com/sqlcipher/sqlcipher下载sqlcipher源码包

解压源码到ubuntu下,进入sqlcipher源码根目录,
./configure –enable-tempstore=yes CFLAGS=”-DSQLITE_HAS_CODEC” LDFLAGS=”-lcrypto” –prefix=/xxxx
make && make install

基本ubuntu下编译很简单,没啥意外。

二、arm-linux-gcc交叉编译
1.编译arm平台下的openssl库
AR=”arm-linux-ar” RANLIB=arm-linux-ranlib CC=arm-linux-gcc /usr/bin/perl ./Configure linux-armv4 –prefix=”/home/software/arm_openssl/”
make && make install

2.交叉编译sqlcipher
./configure –prefix=/xxxxx –enable-tempstore=yes CFLAGS=”-DSQLITE_HAS_CODEC” LDFLAGS=”-lcrypto” –host=”arm-none-linux-gnueabi”
make && make install

由于写这份文档的时间距离搞sqlcipher过去很久了,许多编译出错的点都忘了,大概能整理这么多吧,其它一些编译需要注意的点就忘了,有什么问题可以留言。

三、测试sqlcipher的加密、解密、加密以有数据库、解密加密过的数据库
—–命令行
对命令行的这些api测试官方网站上的文档其实写清楚了,贴上部分

  1. 创建加密数据库
    $ sqlcipher encrypted.db
    SQLCipher version 3.8.4.3 2014-04-03 16:53:12
    Enter “.help” for instructions
    Enter SQL statements terminated with a “;”
    sqlite> PRAGMA key = ‘thisiskey’;
    sqlite> create table encrypted (id integer, name text);
    sqlite> .schema
    CREATE TABLE encrypted (id integer, name text);
    sqlite> .q

  2. 打开加密数据库
    $ sqlcipher encrypted.db
    SQLCipher version 3.8.4.3 2014-04-03 16:53:12
    Enter “.help” for instructions
    Enter SQL statements terminated with a “;”
    sqlite> PRAGMA key = ‘thisiskey’;
    sqlite> .schema
    CREATE TABLE encrypted (id integer, name text);

  3. 修改数据库密码
    sqlite> PRAGMA rekey = ‘newkey’;

  4. 加密已有的数据库
    $ sqlcipher banklist.sqlite3
    SQLCipher version 3.8.4.3 2014-04-03 16:53:12
    Enter “.help” for instructions
    Enter SQL statements terminated with a “;”
    sqlite> ATTACH DATABASE ‘encrypted.db’ AS encrypted KEY ‘thisiskey’;
    sqlite> SELECT sqlcipher_export(‘encrypted’);
    sqlite> DETACH DATABASE encrypted;

  5. 解密数据库
    $ sqlcipher encrypted.db
    SQLCipher version 3.8.4.3 2014-04-03 16:53:12
    Enter “.help” for instructions
    Enter SQL statements terminated with a “;”
    sqlite> PRAGMA key = ‘thisiskey’;
    sqlite> ATTACH DATABASE ‘plaintext.db’ AS plaintext KEY ”;
    sqlite> SELECT sqlcipher_export(‘plaintext’);
    sqlite> DETACH DATABASE plaintext;

—–cpp代码
与sqlite代码一样,不一样的地方是每次进行数据库open之后要紧跟密码认证:
sqlite3_exec(db, “PRAGMA key = ‘password’”, NULL, NULL, NULL);

从这条命令也可以看出sqlcipher的代码执行的sql语句可以是sqlcipher自定义的命令行语句,例如”PRAGMA”等等。

(文档写得很烂,也没查错,太困了 。。。下次有时间优化一下文档吧)
.
.
.
.
.
.
.
(20160622,补一个)
记起来当时要实现在arm9里对sqlite数据库进行加密,编译了sqlcipher后,在arm9环境跑,每次操作数据库进行第一次认证需要20+s时间,这肯定不能忍,期间查看了编译选项,尝试编译不同的库,都不能解决问题;又在百度搜索,可是相关资料实在太少。
无奈耗费时间做了工作想想要放弃这个方案,我不甘心,给sqlcipher开源库作者发邮件,哈哈,我那蹩脚的英文,洋洋洒洒写得我都脸红感觉把问题阐述清楚了,也没期望作者能回,没想到真的后来回了,不过也没什么实质性的建议。
我还是不甘心,于是在官网看官方文档,看api,最终看到sqlcipher有一个修改加盐hash次数的接口,提到其默认次数是6w多次,我有点懵逼,搜了一下这个加盐hash迭代次数,有点懂了需要耗费cpu来进行这么多次加字符串计算,可是我们的项目需求只是能实现加密就可以啦,于是又找源码,看看这个默认次数定义在哪里(貌似是什么crypto.c对应的头文件还是啥的忘了,现在也懒得找了),后来找到,过段把次数修改为1000再编译运行,就没什么延迟了。
如果有相同问题可以试试看 …
.
.
.
.
.
看了一下开头,写太烂了,修改一下,以下凭记忆手码,有问题请忽略
sqlcipher是一个sqlite的封装项目
sqlite开源版本没有加解密功能,但作者有在源码里留下加解密接口(sqlite3_key/sqlite3_key_v2,sqlite3_rekey/sqlite3_rekey_v2),因此目前的加密方案就两种:一是存储时对数据进行加密,读数据时再进行解密;二是扩展sqlite的加解密接口,因此许多sqlite加密方案开源库都是基于这个的(你也可以自己扩展,不过加密学这些东西太难,要快速实现在工程中进行sqlite加密还是用开源的吧),包括wxsqlite、sqlcipher、sqlite官方收费版等。
因此sqlcipher源码包含了sqlite源码,除此还有其封装sqlite的代码。编译sqlcipher即编译了sqlite,libsqlcipher也可以当正常的sqlite库用,sqlite包含的接口sqlcipher都支持。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值