一、下载代码

sqlcipher赖openssl库,首先下载openssl:

[fulinux@ubuntu ~]$ git clone https://github.com/openssl/openssl.git

下载sqlcipher:

网站:http://git.oschina.net/fulinux/sqlcipher.git或者https://github.com/sqlcipher/sqlcipher.git

[fulinux@ubuntu ~]$ git clone http://git.oschina.net/fulinux/sqlcipher.git

或者

[fulinux@ubuntu ~]$ git clone https://github.com/sqlcipher/sqlcipher.git

二、编译

编译openssl:

[fulinux@ubuntu openssl]$ ./config
[fulinux@ubuntu openssl]$ sudo make install

编译sqlcipher:

[fulinux@ubuntu sqlcipher]$mkdir install
[fulinux@ubuntu sqlcipher]$./configure --enable-tempstore=yes CFLAGS="-DSQLITE_HAS_CODEC" LDFLAGS="-lcrypto" --prefix=$PWD/install && make install

假设遇到编译问题,请checkout到发行版本号

[fulinux@ubuntu sqlcipher]$git checkout v3.1.0 

编译成功后。project根文件夹的下install/bin/中有一个sqlcipher运行文件,为了方便复制到project根文件夹下:

[fulinux@ubuntu sqlcipher]$ ls install/bin/
sqlcipher
[fulinux@ubuntu sqlcipher]$ cp install/bin/sqlcipher .

三、測试

新建一个数据库:

[fulinux@ubuntu sqlcipher]$ ./sqlcipher test.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 = '12345';
sqlite> create table film (number,name);
sqlite> insert into film values (1,'aaa');
sqlite> insert into film values (2,'bbb');
sqlite> select * from film;
1|aaa
2|bbb
sqlite> .quit

打开上面创建的数据库:

[fulinux@ubuntu sqlcipher]$ ./sqlcipher test.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 = '12345';
sqlite> .schema
CREATE TABLE film (number,name);
sqlite> select * from film;
1|aaa
2|bbb
sqlite>

错误測试:

[fulinux@ubuntu sqlcipher]$ ./sqlcipher test.db
SQLCipher version 3.8.4.3 2014-04-03 16:53:12
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> select * from film;
Error: file is encrypted or is not a database
sqlite>

四、加密前后測试

用sqlite3查看数据:

[fulinux@ubuntu sqlite]$ sqlite3 test.db
SQLite version 3.8.5 2014-06-04 14:06:34
Enter ".help" for usage hints.
sqlite> select * from test;
1|hxl
2|sqlite
3|test
4|for
5|linux
sqlite>

用vim -b test.db,然后用xxd把文件转换成十六进制格式

:%!xxd

能够看到数据是没有加密的,显而易见:

00007d0: 0000 0805 0300 176c 696e 7578 0604 0300  .......linux....
00007e0: 1366 6f72 0703 0300 1574 6573 7409 0203 .for.....test...
00007f0: 0019 7371 6c69 7465 0601 0300 1368 786c ..sqlite.....hxl

再把这个没有加密的test.db数据库文件通过sqlcipher转换为加密格式的。

1、用sqlcipher或者sqlite打开未加密的test.db文件:

[fulinux@ubuntu sqlcipher]$ ./sqlcipher test.db
SQLCipher version 3.8.4.3 2014-04-03 16:53:12
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> select * from test;
1|hxl
2|sqlite
3|test
4|for
5|linux
sqlite>

2、把数据导成sql格式文件:

sqlite> .output test.sql
sqlite> .dump
sqlite> .exit

3、结合test.sql文件生成一个加密的数据库文件test1.db:

[fulinux@ubuntu sqlcipher]$ ./sqlcipher test1.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 = 'test';
sqlite> .read test.sql
sqlite>
sqlite> select * from test;
1|hxl
2|sqlite
3|test
4|for
5|linux
sqlite> .exit

4、导入成功后,我们在用vim -b打开test1.db数据库文件。能够觉得你看到的基本上都是乱码:

00001b0: 913c 52e4 5809 83b9 153a 8d5d 4b84 9715  .<R.X....:.]K...
00001c0: a552 f8fb 9e3f 9637 4c9a 4b00 2259 a95b .R...?.7L.K."Y.[
00001d0: 91d6 95da ce34 f9f2 5b05 2bea 439b 7cae .....4..[.+.C.|.
00001e0: 1e60 333f 5323 21a9 989b a08a ad4f ea78 .`3?S#!......O.x

五、C代码測试

编辑一个C代码文件test.c。代码能够:

/*********************************************************************************
* Copyright: (C) 2014 EAST
* All rights reserved.
*
* Filename: test.c
* Description: This file
*
* Version: 1.0.0(07/25/2014)
* Author: fulinux <fulinux@sina.com>
* ChangeLog: 1, Release initial version on "07/25/2014 05:15:05 PM"
*
********************************************************************************/ #include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h> static int callback(void *notused, int argc, char **argv, char **azcolname)
{
int i;
for(i = 0; i < argc; i++){
printf ("%s = %s\n", azcolname[i], argv[i]?argv[i]:"NULL");
} printf ("\n");
return 0;
} /********************************************************************************
* Description:
* Input Args:
* Output Args:
* Return Value:
********************************************************************************/
int main (int argc, char **argv)
{
sqlite3 *db;
char *zerrmsg = 0;
int rc; if(argc != 3){
fprintf(stderr, "Usage: %s DATABASE SQL-STATEMENT\n", argv[0]);
exit(0);
} rc = sqlite3_open(argv[1], &db);
if(rc){
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
return 1;
} sqlite3_key(db, "test", 4);
rc = sqlite3_exec(db, argv[2], callback, 0, &zerrmsg);
if(rc != SQLITE_OK){
fprintf(stderr, "SQL error: %s\n", zerrmsg);
sqlite3_free(zerrmsg);
} sqlite3_close(db);
return 0;
} /* ----- End of main() ----- */

代码上面的代码能够在这里下载:

[fulinux@ubuntu ~]$ git clone http://git.oschina.net/fulinux/jupiter.git
[fulinux@ubuntu jupiter]$ git checkout sqlcipher

编译test.c文件,由于库和头文件都在/home/fulinux/sqlcipher/install文件夹下,所以以下參数例如以下:

[fulinux@ubuntu jupiter]$ gcc -g test.c -o test -lsqlcipher -L /home/fulinux/sqlcipher/install/lib/ -I /home/fulinux/sqlcipher/install/include/sqlcipher/

运行測试程序:

[fulinux@ubuntu jupiter]$./test test1.db "select * from test;"
id = 1
value = hxl
id = 2
value = sqlite
id = 3
value = test
id = 4
value = for
id = 5
value = linux

相关网址:http://sqlcipher.net/sqlcipher-api/

author: fulinux

e-mail:fulinux@sina.com

blog: blog.csdn.net/fulinus

版权声明:本文博主原创文章,博客,未经同意不得转载。

sqlcipher移植的更多相关文章

  1. MVVM框架从WPF移植到UWP遇到的问题和解决方法

    MVVM框架从WPF移植到UWP遇到的问题和解决方法 0x00 起因 这几天开始学习UWP了,之前有WPF经验,所以总体感觉还可以,看了一些基础概念和主题,写了几个测试程序,突然想起来了前一段时间在W ...

  2. IIC驱动移植在linux3.14.78上的实现和在linux2.6.29上实现对比(deep dive)

    首先说明下为什么写这篇文章,网上有许多博客也是介绍I2C驱动在linux上移植的实现,但是笔者认为他们相当一部分没有分清所写的驱动时的驱动模型,是基于device tree, 还是基于传统的Platf ...

  3. Linux主机上使用交叉编译移植u-boot到树莓派

    0环境 Linux主机OS:Ubuntu14.04 64位,运行在wmware workstation 10虚拟机 树莓派版本:raspberry pi 2 B型. 树莓派OS: Debian Jes ...

  4. STM32F429 LCD程序移植

    STM32F429自带LCD驱动器,这一具有功能给我等纠结于屏幕驱动的程序员带来了很大的福音.有经验的读者一定有过这样的经历,用FSMC驱动带由控制器的屏幕时候,一旦驱动芯片更换,则需要重新针对此驱动 ...

  5. 将MPM雪模拟移植到Maya

    同事实现了一个迪士尼的MPM雪模拟论文,我将其移植到Maya中 论文题目是 A material point method for snow simulation 代码在这里: https://git ...

  6. ucos实时操作系统学习笔记——操作系统在STM32的移植

    使用ucos实时操作系统是在上学的时候,导师科研项目中.那时候就是网上找到操作系统移植教程以及应用教程依葫芦画瓢,功能实现也就罢了,没有很深入的去研究过这个东西.后来工作了,闲来无聊就研究了一下这个只 ...

  7. Android数据存储之SQLCipher数据库加密

    前言: 最近研究了Android Sqlite数据库(文章地址:Android数据存储之Sqlite的介绍及使用)以及ContentProvider程序间数据共享(Android探索之ContentP ...

  8. DM9000驱动移植在mini2440(linux2.6.29)和FS4412(linux3.14.78)上的实现(deep dive)篇一

    关于dm9000的驱动移植分为两篇,第一篇在mini2440上实现,基于linux2.6.29,也成功在在6410上移植了一遍,和2440非常类似,第二篇在fs4412(Cortex A9)上实现,基 ...

  9. geotrellis使用(二十五)将Geotrellis移植到spark2.0

    目录 前言 升级spark到2.0 将geotrellis最新版部署到spark2.0(CDH) 总结 一.前言        事情总是变化这么快,前面刚写了一篇博客介绍如何将geotrellis移植 ...

随机推荐

  1. iOS9升级后第三方平台无法分享的问题

    最近升级到了Xcode7,在真机调试中发现在初始化微博SDK时程序Crash. 解决办法从微博官网下一个最新的SDK,替换掉工程中的即可. 2.替换微博最新SDK之后成功运行程序,之后发现微信.QQ. ...

  2. cas sso入门(转)

    转:http://blog.csdn.net/frinder/article/details/7969925 一.教程说明 前言 教程目的:从头到尾细细道来单点登录服务器及客户端应用的每个步骤 单点登 ...

  3. 将对象保存至文件——CArchive

    CArchive允许以一个二进制的形式保存一个对象的复杂网络,也可以再次装载它们,在内存中重新构造,这一过程叫作串行化/序列化(Serialization),简单的说,CArchive与CFile配合 ...

  4. Java中异常的基本应用(一)

    在Java中,我们把异常当做一种对象来处理,正是异常机制的引入,使得我们的程序更加健壮.异常指示了一个不正常的条件,或者一个错误条件,简单地说就是一个中断了正常的指令流的事件.程序控制将无条件的抛至一 ...

  5. vim插件和配置

    vim插件和配置 插件 pathogen 可以方便地管理vim插件 在没有pathogen的情况下,vim插件的文件全部都放在.vim目录,卸载插件很麻烦,pathogen可以将不同的插件放在一个单独 ...

  6. 9 Palindrome Number(判断是否为回文数Easy)

    题目意思:判断是否为回文数,不许使用额外空间 ps:一直不理解额外空间的意思,int能用吗 思路:1.比较头尾 2.翻转,越界问题需考虑 class Solution { public: bool i ...

  7. 144 Binary Tree Preorder Traversal(二叉树先序遍历Medium)

    题目意思:二叉树先序遍历,结果存在vector<int>中 解题思路:1.递归(题目中说用递归做没什么意义,我也就贴贴代码吧) 2.迭代 迭代实现: class Solution { pu ...

  8. Yii2的相关学习记录,初始化Yii2(二)

    前面已经将Yii2下载下来了,那我们就需要能实际的使用. 一.初始化,因为我都是在windows系统下,所以用cmd命令打开下载下来的Yii2的根目录.然后运行下面命令: init 会提示选择0为开发 ...

  9. HTML&CSS基础学习笔记1.33-元素选择器

    元素选择器 最常见的 CSS 选择器是元素选择器.换句话说,文档的元素就是最基本的选择器: p { text-indent:10px; color:blue; } 什么情况下使用元素选择器,一般我们这 ...

  10. C#.Net参数

    C#.Net参数 阅读目录 引言 形参和实参 命名实参 可选参数 params,数目可变参数 方法解析与重载决策 参数传递      [重难点] ref引用参数/out输出参数   参数修饰符 泛型类 ...