zoukankan      html  css  js  c++  java
  • 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
    ", azcolname[i], argv[i]?argv[i]:"NULL");
        }
    
        printf ("
    ");
        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
    ", argv[0]);
            exit(0);
        }
    
        rc = sqlite3_open(argv[1], &db);
        if(rc){
            fprintf(stderr, "Can't open database: %s
    ", 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
    ", 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


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

  • 相关阅读:
    C++ tinyXml直接解析XML字符串
    留言板小程序开发笔记3
    如何去除 gvim 的 acp和 "option omnifunc is not set" 的问题
    如何修改bootstrap模态框的backdrop蒙版区域的颜色?
    Windows下卸载软件时提示 等待先前的卸载完成? 终止 dllhost.exe 进程
    thinkphp中的__DIR__ __ROOT__ __APP__ __MODULE__ APP_PATH LIB_PATH MODULE_PATH 等是在哪里定义的?
    thinkphp中的Ueditor的使用, 以及如何传递编辑器内容到后台?
    留言板小程序开发笔记2
    分页器的js实现代码 bootstrap Paginator.js
    windows的gvim总是报错: +iconv fencview.vim
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4882560.html
Copyright © 2011-2022 走看看