sqlcipher移植
一、下载代码
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移植的更多相关文章
- MVVM框架从WPF移植到UWP遇到的问题和解决方法
MVVM框架从WPF移植到UWP遇到的问题和解决方法 0x00 起因 这几天开始学习UWP了,之前有WPF经验,所以总体感觉还可以,看了一些基础概念和主题,写了几个测试程序,突然想起来了前一段时间在W ...
- IIC驱动移植在linux3.14.78上的实现和在linux2.6.29上实现对比(deep dive)
首先说明下为什么写这篇文章,网上有许多博客也是介绍I2C驱动在linux上移植的实现,但是笔者认为他们相当一部分没有分清所写的驱动时的驱动模型,是基于device tree, 还是基于传统的Platf ...
- Linux主机上使用交叉编译移植u-boot到树莓派
0环境 Linux主机OS:Ubuntu14.04 64位,运行在wmware workstation 10虚拟机 树莓派版本:raspberry pi 2 B型. 树莓派OS: Debian Jes ...
- STM32F429 LCD程序移植
STM32F429自带LCD驱动器,这一具有功能给我等纠结于屏幕驱动的程序员带来了很大的福音.有经验的读者一定有过这样的经历,用FSMC驱动带由控制器的屏幕时候,一旦驱动芯片更换,则需要重新针对此驱动 ...
- 将MPM雪模拟移植到Maya
同事实现了一个迪士尼的MPM雪模拟论文,我将其移植到Maya中 论文题目是 A material point method for snow simulation 代码在这里: https://git ...
- ucos实时操作系统学习笔记——操作系统在STM32的移植
使用ucos实时操作系统是在上学的时候,导师科研项目中.那时候就是网上找到操作系统移植教程以及应用教程依葫芦画瓢,功能实现也就罢了,没有很深入的去研究过这个东西.后来工作了,闲来无聊就研究了一下这个只 ...
- Android数据存储之SQLCipher数据库加密
前言: 最近研究了Android Sqlite数据库(文章地址:Android数据存储之Sqlite的介绍及使用)以及ContentProvider程序间数据共享(Android探索之ContentP ...
- DM9000驱动移植在mini2440(linux2.6.29)和FS4412(linux3.14.78)上的实现(deep dive)篇一
关于dm9000的驱动移植分为两篇,第一篇在mini2440上实现,基于linux2.6.29,也成功在在6410上移植了一遍,和2440非常类似,第二篇在fs4412(Cortex A9)上实现,基 ...
- geotrellis使用(二十五)将Geotrellis移植到spark2.0
目录 前言 升级spark到2.0 将geotrellis最新版部署到spark2.0(CDH) 总结 一.前言 事情总是变化这么快,前面刚写了一篇博客介绍如何将geotrellis移植 ...
随机推荐
- 01.Net入门知识
1..Net学习路线及几个容易混淆的概念 .Net只是一个平台,提供运行.Net程序需要的虚拟机.类库等 C#就是.Net平台下的一个开发语言,.Net下的语言还有VB.Net.PowerShell等 ...
- wpf 控件复制 克隆
方法1: string xaml = System.Windows.Markup.XamlWriter.Save(rtb1); RichTextBox rtb2 =System.Windows.Mar ...
- QFormLayout
这个是官方的文档,现在还没有翻译,有时间自己会把这个好好的翻译一下. QFormLayout类是用来管理表格的输入部件以及和它们相关联的标签. 也就是说QFormLayout这个布局一般情况下是用来在 ...
- jQuery中$.get()、$.post()和$.ajax()
jQuery.get()方法: $.get(url,data,success(response,status,xhr),dataType) 该函数是简写的 Ajax 函数,等价于: $.ajax({ ...
- jQuery图片提示示例
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- div(固定宽度和不固定宽度)居中显示的方法总结
今天我总结一下css实现div居中的方法,有的是固定宽度的,还有的是不固定宽度的. 1.使用自动外边距实现DIV CSS居中 CSS中首选的让元素水平居中的方法就是使用margin属性—将元素的mar ...
- python运维开发之第八天(socket)
什么是 Socket? Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯. soc ...
- Python自动化运维之21、CSS
一.css简介 CSS 是 Cascading Style Sheets的缩写,称为层叠样式表,用来设计网页的样式布局,以及大小来适应不同的屏幕等,使网页的样式和网页数据分离, 二.导入css 导入c ...
- 如何让你的Python程序支持多语言
如何让你的Python程序支持多语言 本文介绍如何通过Python标准库gettext帮助你的程序支持多语言. 代码例子 import random guessesTaken = 0 print(_( ...
- Sqlserver 正则替换函数的一种实现
--函数 IF OBJECT_ID(N'dbo.RegexReplace') IS NOT NULL DROP FUNCTION dbo.RegexReplace GO CREATE FUNCTION ...