SQLite 加密 -- SQLCipher

SQLite3 插件 github 下载地址  

插件配置步骤地址

购买地址

其他加密方式介绍

SQLCipher API 地址

前言

  应用使用 SQLite 来存储数据,很多时候需要对一部分的数据进行加密。常见的做法是对要存储的内容加密后存到数据库中,使用的时候对数据进行解密。这样就会有大量的性能消耗在数据的加密解密上。

  SQLite 本身是支持加密功能的 (免费版本不提供加密功能,商业版本是支持加密模块)。SQLCipher 是一个开源的 SQLite 加密的扩展,支持对 db 文件进行 256位的 AES 加密。

  

加密与非加密的数据库对比

  打开 Terminal 输入以下内容,

~ $ sqlite3 sqlcipher.db
sqlite> PRAGMA KEY=’test123′;
sqlite> CREATE TABLE t1(a,b);
sqlite> INSERT INTO t1(a,b) VALUES (‘one for the money’, ‘two for the show’);
sqlite> .quit

~$ hexdump -C sqlite.db

  

  结果:

  

配置步骤

  1、到 github 上下载 SQLCipher 插件,并存放到项目根目录下。

  2、sqlcipher.xcodeproj 以 static library 的方式添加到项目里面。

  3、关联新添加的静态库

  

  4、设置 Build Setting

    "Header Search Path" 添加,"../sqlcipher/src",这里需要注意路径的关系。

  "Other C Flags" 添加 "-DSQLITE_HAS_CODEC"

项目中使用示例

#import <sqlite3.h>

- (void)openDB2 {
    NSString *documentPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
    NSString *db2Path = [documentPath stringByAppendingPathComponent:db2Name];

    if (sqlite3_open([db2Path UTF8String], &database2) == SQLITE_OK) {
        const char* key = [@"eileen" UTF8String];
        sqlite3_key(database2, key, strlen(key));
//        if (sqlite3_exec(database2, (const char*) "CREATE TABLE t1 (a, b);", NULL, NULL, NULL) == SQLITE_OK) {
//            NSLog(@"password is correct, or, database has been initializ");
//
//        } else {
//            NSLog(@"incorrect password!");
//        }
//        sqlite3_close(database2);

         if (sqlite3_exec(database2, "INSERT INTO t1(a, b) VALUES(‘qqqqqqq‘, ‘pppppp‘)", NULL, NULL, NULL)==SQLITE_OK) {
             NSLog(@"密码正确");
         }
         else {
             NSLog(@"密码错误");
         }

        sqlite3_stmt *statement = NULL;
        sqlite3_prepare_v2(database2, "SELECT a,b FROM t1", -1, &statement, NULL);

        while (sqlite3_step(statement) == SQLITE_ROW) {
            char *field0 = (char*)sqlite3_column_text(statement, 0);
            NSString *field0Str = @"";
            if (field0) {
                field0Str = [NSString stringWithUTF8String:field0];
            }

            char *field1 = (char*)sqlite3_column_text(statement, 1);
            NSString *field1Str = @"";
            if (field1) {
                field1Str = [NSString stringWithUTF8String:field1];
            }
            NSLog(@"a = %@, b = %@;", field0Str, field1Str);
        }
        sqlite3_finalize(statement);
    }
    else {
      sqlite3_close(database2);
    }
}

Terminal 上安装 SQLCipher

  总的来说在 Terminal 执行以下 2句即可,参照

$ ./configure --enable-tempstore=yes CFLAGS="-DSQLITE_HAS_CODEC" LDFLAGS="-lcrypto"    ;#  Run the configure script
$ make    ;#  Run the makefile.

  1、cd 到下载好的 sqlcipher 目录下,并执行

$ ./configure --enable-tempstore=yes CFLAGS="-DSQLITE_HAS_CODEC" LDFLAGS="-lcrypto"

  

  2、输入

$ make

    2.1、发生了错误,

sqlite3.c:18280:10: fatal error: ‘openssl/rand.h‘ file not found

#include <openssl/rand.h>

    见下图:

    解决方法,输入:

$ brew link openssl --force

  

    2.2、发生错误,“-bash: brew: command not found”,证明 OS 尚未安装 Homebrew。(安装 Homebrew 的前提下是安装了 Xcode, 并且 Command Line Tools 已安装, Terminal 输入 "gcc --version" 检查)

    解决方法,输入:

$ -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

    2.3、安装好 Homebrew 后,重新执行

$ brew link openssl --force

    发生了错误:Error: No such keg: /usr/local/Cellar/openssl

    解决方法,使用 brew 安装 openssl,输入:

$ brew install openssl

  

  

    2.4、安装完 openssl 后,重新执行

$ brew link openssl --force

  

    执行完后,再重新执行

$ make

  

    多次执行 make 操作会发生错误 “make: Nothing to be done for `all‘”,解决方法,输入:

$ make clean

// 重新执行

$ make

  

  3、执行完前面 2 步,sqlcipher 目录下会多了一个 sqlcipher 文件,用于 Terminal 中管理数据库。

  

 

Terminal 查看和修改数据库的密码管理

  cd 到刚才新生成的 sqlcipher 文件的目录下,执行以下的操作,参照

  1、使用 SQLCipher 加密已经存在的数据库

$ ./sqlcipher plaintext.db
sqlite> ATTACH DATABASE ‘encrypted.db‘ AS encrypted KEY ‘testkey‘;
sqlite> SELECT sqlcipher_export(‘encrypted‘);
sqlite> DETACH DATABASE encrypted;

  

  2、解除使用 SQLCipher 加密的数据库密码

$ ./sqlcipher encrypted.db
sqlite> PRAGMA key = ‘testkey‘;
sqlite> ATTACH DATABASE ‘plaintext.db‘ AS plaintext KEY ‘‘;  -- empty key will disable encryption
sqlite> SELECT sqlcipher_export(‘plaintext‘);
sqlite> DETACH DATABASE plaintext;

  

注意

  有些软件的加密方式是不公开的,例如 Mac SQLiteManager 生成的加密的 .db 文件没法在程序里面解密打开。程序里面生成的加密的 .db 文件也没法用 Mac 上的 SQLiteManager 打开。

  免费版本的项目代码不提供以下的功能:

  • 数据库创建的时候,没有使用 sqlite3_key 设置密码,之后不能添加密码管理;
  • 对创建时已经设置了密码管理的数据库,不能取消其密码管理,只能重新设置新的密码;
时间: 2024-07-31 14:26:35

SQLite 加密 -- SQLCipher的相关文章

SQLite加密方式 [转]

关于SQLite SQLite是一个轻量的.跨平台的.开源的数据库引擎,它的在读写效率.消耗总量.延迟时间和整体简单性上具有的优越性,使其成为移动平台数据库的最佳解决方案(如iOS.Android). 然而免费版的SQLite有一个致命缺点:不支持加密.这就导致存储在SQLite中的数据可以被任何人用任何文本编辑器查看到. SQLite加密方式 对数据库加密的思路有两种: 1. 将内容加密后再写入数据库 这种方式使用简单,在入库/出库只需要将字段做对应的加解密操作即可,一定程度上解决了将数据赤裸

Android数据存储之Sqlite采用SQLCipher数据库加密实战

前言: 最近研究了Android Sqlite数据库(文章地址:http://www.cnblogs.com/whoislcj/p/5506294.html)以及ContentProvider程序间数据共享(http://www.cnblogs.com/whoislcj/p/5507928.html),我们清晰的知道Sqlite数据库默认存放位置data/data/pakage/database目录下,对于已经ROOT的手机来说的没有任何安全性可以,一旦被利用将会导致数据库数据的泄漏,所以我们该

iOS SQLite加密之SQLCipher

至于SQLCipher,我就不多说了,百度一下,你就知道.公司的iOS APP要给SQLite,今天就上网查了些资料,做了下整理,主要参考SQLCipher的官方集成文档,有不妥之处大家提出来我再改进,感谢拍砖.官方集成文档:https://www.zetetic.net/sqlcipher/ios-tutorial/. Prerequisites 安装Xcode开发环境,不用多说了吧. OpenSSL 本教程用苹果提供的FrameWork:CommonCrypto,可在工程,Target,Bu

Android数据库(sqlite)加密方案

最近因为一些项目的安全性需要将数据库加密,一开始想到的就是先将数据库通过AES加密,然后运行时再解密,另一种是将数据库里的内容加密. 很快这两种方案都是不理想的,第一种加密方式形同虚设,第二种,如果加密的字段是要查找数据就变得麻烦. 所以第三种方案就是在内存里解密,在网上查到SQLITE是支持加密的, 所以就根据网上的指导一步步地将SQLITE编译成支持加密的. 那下一步就是怎样做成SDK去方便使用?第一个念头就是将原生的数据库使用方式移植过来,但做起来比开始想像的难了点,但最终也在修修补补中完

【转】Android SQLite加密

原文地址:http://blog.csdn.net/feifei454498130/article/details/8843402 最近因为一些项目的安全性需要将数据库加密,一开始想到的就是先将数据库通过AES加密,然后运行时再解密,另一种是将数据库里的内容加密. 很快这两种方案都是不理想的,第一种加密方式形同虚设,第二种,如果加密的字段是要查找数据就变得麻烦. 所以第三种方案就是在内存里解密,在网上查到SQLITE是支持加密的, 所以就根据网上的指导一步步地将SQLITE编译成支持加密的. 那

cocos2d-x 2.1 Win32+Android开发中的sqlite数据库加密技术探讨

注意:本博客转移自本人约一年前的ITPUB博客文章,为的是便于学员参考之用. 很显然,cocos2d-x编程中只了解基本的sqlite数据库操作技术只是一个开头,真正把此数据库数据应用于实际中不使用一定的加密及解密技术几乎是不行的. 这个问题尽早会来到我面前,这不?现在就来了.一开始,自然想使用最省工的了:但是,这样的好事并不多,极少极少...... 于是,我先搜罗了一些现成的文章拿来一阅. 1,Sqlite数据库加密解密 SRC: http://blog.sina.com.cn/s/blog_

SQLite XXTea加密学习

这几天优化数据库读写,移植了xxtea加密到最新的数据库sqlite 3.12.2里,一些好文章放在这里.移植后,数据库读写性能异常优秀! 这几天又发现,数据库还是发生了无法写入情况,数据库崩溃掉了.所以,估计想兼容以前数据库是很困难的了.. 十分推荐他的博客:SQLite学习笔记(十)&&加密    Sqlite学习笔记(一)&&编译安装 sqlite3.6.18加密模块change(讨论) sqlite3 加解密 SQLITE3 加密总结 sqlite3+使用总结 SQ

iOS 使用FMDB SQLCipher给数据库加密

关于SQLite,SQLCipher和FMDB SQLite是一个轻量的.跨平台的.开源的数据库引擎,它的在读写效率.消耗总量.延迟时间和整体简单性上具有的优越性,使其成为移动平台数据库的最佳解决方案(如iOS.Android).然而免费版的SQLite有一个致命缺点:不支持加密.这就导致存储在SQLite中的数据可以被任何人用任何文本编辑器查看到. 如果我们想要使得自己的数据库加密,解决方案就是使用另一款开源的加密数据库SQLCipher,SQLCipher使用256-bit AES加密,由于

加密你的SQLite

转自王中周的个人博客 关于SQLite SQLite是一个轻量的.跨平台的.开源的数据库引擎,它的在读写效率.消耗总量.延迟时间和整体简单性上具有的优越性,使其成为移动平台数据库的最佳解决方案(如iOS.Android). 然而免费版的SQLite有一个致命缺点:不支持加密.这就导致存储在SQLite中的数据可以被任何人用任何文本编辑器查看到.比如国内某团购iOS客户端的DB缓存数据就一览无余: SQLite加密方式 对数据库加密的思路有两种: 1. 将内容加密后再写入数据库 这种方式使用简单,