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、关联新添加的静态库 (注意,这里不能包含系统的 libsqlite3.dylib)

  

  4、设置 Build Setting

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

  "Other C Flags" 添加 "-DSQLITE_HAS_CODEC"

由于 SQLCipher 是支持 Mac OSX, iOS, WatchOS, TVOS 等多个平台,所以必要的时候,需要修改 sqlcipher.project 的配置文件,否则会引起编译或者 linking 错误,修改如下:

项目中使用示例

#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 设置密码,之后不能添加密码管理;
  • 对创建时已经设置了密码管理的数据库,不能取消其密码管理,只能重新设置新的密码;

SQLite 加密 -- SQLCipher的更多相关文章

  1. Android中对sqlite加密--SQLCipher

    原文:Android中对sqlite加密--SQLCipher android中有些时候会将一些隐私数据存放在sqlite数据库中,在root过的手机中通过RE就能够轻松的打开并查看数据库所有内容,所 ...

  2. SQLite加密方式 [转]

    关于SQLite SQLite是一个轻量的.跨平台的.开源的数据库引擎,它的在读写效率.消耗总量.延迟时间和整体简单性上具有的优越性,使其成为移动平台数据库的最佳解决方案(如iOS.Android). ...

  3. SQLite加密 wxSqlite3

    一直在网上搜wxSqlite3的文档,但是总找不到能真正解决问题的,就是一个简单的编译wxSqlite3自带的示例也出了老多问题,后来却发现,其实wxSqlite3的readme中已经有了详细的方法, ...

  4. iOS Sqlite加密(FMDB/SQLCipher)

    /** * 对数据库加密 * * @param path path description * * @return return value description */ + (BOOL)encryp ...

  5. sqlite加密

    一直使用sqlite来管理本地的数据,但是Xcode中的SDK中集成的sqlite是免费的,不提供加密模块,但是程序中用到的很多数据,有时候是不想让别人看到,一开始虑修改sqlite的源码,自己重新编 ...

  6. SQLite加密的方法(c#)

    http://blog.csdn.net/xjbx/article/details/2712236 设置下密码就可以了 http://bbs.csdn.net/topics/380018685 编译为 ...

  7. Android数据库(sqlite)加密方案

    最近因为一些项目的安全性需要将数据库加密,一开始想到的就是先将数据库通过AES加密,然后运行时再解密,另一种是将数据库里的内容加密. 很快这两种方案都是不理想的,第一种加密方式形同虚设,第二种,如果加 ...

  8. [转]正确使用SQLCipher来加密Android数据库 - 朝野布告

    参考文档:http://www.tuicool.com/articles/eYNFbuA Android本身自带有不加密的数据库SQLite,如果要保存密码之类的敏感数据在本地的话方法一是使用字段加密 ...

  9. 正确使用SQLCipher来加密Android数据库

    Android本身自带有不加密的数据库SQLite,如果要保存密码之类的敏感数据在本地的话方法一是使用字段加密解密算法,方法二是整个数据库都加密掉.如果只是加密解密某个字段(如password)就推荐 ...

随机推荐

  1. Struts2与Struts1的区别

    Struts2是基于WebWork的一个全新框架.不过有了Struts1的基础,学Struts2更方便.Struts2主要改进是取代了Struts1的Servlet和Action.Struts2的核心 ...

  2. hdu 1503 Advanced Fruits

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1503 思路:这是一道最长公共子序列的题目,当然还需要记录路径.把两个字符串的最长公共字串记录下来,在递 ...

  3. WebConfig配置

    安全配置示例 https://msdn.microsoft.com/zh-cn/magazine/gg309184.aspx

  4. 与你相遇好幸运,使用gulp流程化Typescript后端开发

    tsc --init {    "compilerOptions": {        "module": "commonjs",      ...

  5. ASP.NET4.5Web API及非同步程序开发系列(2)

    认识ASP.NET WEB API 他的前身为WCF WEB API用于协助WCF支持RestFul.现在集成进ASP.NET,正式更名为ASP.NET WEB API,ASP.NET Web API ...

  6. [译]:Orchard入门——媒体文件的添加与管理

    原文链接:Adding and Managing Media Content 注:此文内容相对较老,实际操作指导性不强,仅适合做研究 当你利用富文本编辑器上传图片时(或者使用XML-RPC客户端,例如 ...

  7. Asp.net导出Excel续章(自定义合并单元格,非Office组件)

    结合上次写的导出Excel方法,这次上头要求我将列头进行一下合并 以前的效果: 改进后的效果: 在上篇文章中写到了Excel的导出方法,这次为了避免在生产环境中使用Office组件,服务器各种权限配置 ...

  8. idapython在样本分析中的使用-字符解密

    最近接手的一个样本,样本中使用了大量的xor加密,由于本身样本不全,无法运行(好吧我最稀饭的动态调试没了,样本很有意思,以后有时间做票大的分析),这个时候就只好拜托idapython大法了(当然用id ...

  9. HBase change split policy on an existing table

    hbase(main)::> create 'test_table_region', 'username' row(s) in 1.2150 seconds hbase(main)::> ...

  10. 一个获取指定目录下一定格式的文件名称和文件修改时间并保存为文件的python脚本

    摘自:http://blog.csdn.net/forandever/article/details/5711319 一个获取指定目录下一定格式的文件名称和文件修改时间并保存为文件的python脚本 ...