转http://blog.csdn.net/ydj213/article/details/8650051
demo下载http://download.csdn.net/detail/ydj213/5120854
SQLite是一个持久性数据存储在iPhone上流行的API因此在上攻的发展是显而易见的。作为一个程序员你的工作稳定和有据可查的API。干净利索地从应用程序代码中分离出来的所有安全问题和管理的基本框架
SQLCipher和OpenSSL项目的框架代码都是开放的源代码所以用户可以放心的应用程序不使用不安全的代码或专有的安全。此外这些项目可以编译和支持的Mac OS XWindows上甚至Linux下的桌面应用程序。
在iPhone应用程序中使用SQLCipher很简单一旦你正确设置你的项目。本文档描述了的整合SQLCipher到的iOS XCode项目使用的是社区版的源代码构建过程。本教程假定您熟悉基本的iOS应用开发和安装的iOS SDK和XCode 4.2。相同的基本步骤也应该用Mac OS X的应用程序。
重要注意事项 商业版SQLCipher静态库也可用于iOS和Mac OS X。这些静态库提供相同的功能但更容易的设置建立一个现代版的OpenSSL并为每个生成周期要快得多。更多»
OpenSSL的
SQLCipher使用的广泛信赖和同行评议的OpenSSL库的所有加密功能其中包括AES-256算法伪随机数生成和PBKDF2关键的推导。OpenSSL是不是直接在iPhone上使用的框架所以我们的项目我们将设置为静态库编译并链接。
下载1.0.x的稳定从http://www.openssl.org/source/版本的它解压缩到一个文件夹在您的系统上。由于相同的OpenSSL源代码树可以共享在多个SQLCipher项目这是一个好主意把它放到你的项目文件夹以外的一些共享位置。Justs记后的源目录路径。
SQLCipher
切换到你的项目的根目录和签出SQLCipher项目代码 下载地址https://github.com/sqlcipher/sqlcipher
OpenSSL的X Code中
OpenSSL可以是棘手的从源代码编译。这是更复杂的当你处理多个目标架构iOS开发针对I386的模拟器但ARMv6和ARMv7的设备
OpenSSL的XCode项目 下载地址https://github.com/sqlcipher/openssl-xcode
包括依赖于OpenSSL的配置和系统构建库项目模板。然而它会自动检测到适当的设置是i386x86_64arvm6ARMv7的架构生成工具和SDK。这使得它非常适合在iPhone项目列入。
XCode的设置
SQLCipher使用项目管理的构建依赖关系和静态链接。使用SQLCipher在编写代码之前你必须设置的XCode您的项目建立SQLCipher。
OpenSSL的源代码树
开始打开XCode项目选择Xcode的菜单XCode Menu-》 Preferences,-》Locations tab, and Source Trees screen。添加变量命名OPENSSL_SRC的提取的OpenSSL源代码的路径。
添加子项目引用
现在在XCode全球的喜好设置我们将进入项目配置。
在应用程序项目请单击“在顶层的工程项目。在项目上点击鼠标右键并选择“将文件添加到”项目“或按选项命令添加一个资源。导航到项目目录内的sqlcipher文件夹并添加sqlcipher.xcodeproj。如果你有多个目标是一定要添加的文件都。重复相同的步骤openssl-xcode/openssl.xcodeproj。
配置所需的构建依赖关系
我们必须将构建依赖关系以确保SQLCipher之前被编译的应用程序代码。您的应用选择目标然后打开“信息”面板。在构建阶段“选项卡在”目标依赖“部分中我们将增加双方openssl的/的加密和sqlcipher / sqlcipher的的。使用命令单击以选中两者兼而有之。
然后下链接的二进制文件和库部分中添加libcrypto.a libsqlcipher.a。
请确保libsqlite3.dylib没有被选作链接依赖。
同一组的依存关系和链接设置任何其他目标将取决于SQLCipher即单元测试的项目中。
设置建立的架构和CFLAGS
选择顶层项目然后选择“生成”设置“选项卡扩展的架构设置。发表的debug设置为默认值。例如的ARMv7和armv7s适用于iOSx86_64的为MacOS确定的release架构是正确的。如果需要改变他们。这将确保所有相关的项目将部署在所有所需的硬体架构。
接下来找到搜索头文件的路径设置并添加“sqlcipher”的搜索路径。这将确保Xcode可以找到所需要的头的SQLCipher库。确保“递归”框上包括检查或构建可能会失败。
最后在“other C Flags”附加DSQLITE_HAS_CODEC的Debug和Release C标志设置(分别添加)。这将确保SQLite的密钥管理功能被定义为应用程序的使用。
注如果您选择改变构建架构或使用的编译器你必须采用相同的生成设置下openssl.xcodeproj和sqlcipher.xcodeproj。这三个设置必须匹配的所有项目。
在这一点上你应该没有错误能够建立的XCode项目。请注意在第一时间内为特定的体系结构例如模拟器构建应用程序它会需要更长的时间比平常。这是因为SQLCipher和OpenSSL是从源代码编译为特定的体系结构。您可以跟踪的状态下生成结果。在同一平台上的后续版本将更快因为图书馆没有需要重新编译。
集成代码
现在SQLCipher纳入项目库您可以立即开始使用该系统。告诉SQLCipher加密数据库是那么容易因为打开一个数据库并使用sqlite3_key功能。
[cpp] view plaincopyprint?NSString *databasePath [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]stringByAppendingPathComponent: "sqlcipher.db"];sqlite3 *db;if (sqlite3_open([databasePath UTF8String], SQLITE_OK) {const char* key ["BIGSecret" UTF8String];sqlite3_key(db, key, strlen(key));sqlite3_rekey(db, NULL, 0);if (sqlite3_exec(db, (const char*) "CREATE TABLE sqlmaster (ROW INTEGER , FIELD_DATA TEXT);", NULL, NULL, NULL) SQLITE_OK) {// password is correct, or, database has been initialized} else {// incorrect password!}/*if (sqlite3_exec(db, (const char *)"SELECT count(*) FROM sqlmaster", NULL, NULL, NULL)SQLITE_OK) {NSLog("密码正确");}else{NSLog("密码错误");}*/sqlite3_close(db);}
去本地路径看一下。db文件是不是加密了。。。
请注意的是也可以通过调用PRAGMA键来初始化数据库屁股如下但除非代码是在处理潜在的转义问题不推荐这样做。
PRAGMA key BIGSecret;
发生的调用sqlite3_key或“PRAGMA关键”的应作为第一操作后打开数据库。在大多数情况下SQLCipher使用PBKDF2咸鱼和迭代的密钥导出函数得到的加密密钥。或者应用程序可以告诉SQLCipher的使用一个特定的二进制键在一滴符号请注意SQLCipher需要256位的密钥材料即
PRAGMA key "x2DD29CA851E7B56E4697B0E1F08507293D761A05CE4D1B628663F411A8086D99";
一旦密钥被设置SQLCipher会自动在数据库中的所有数据进行加密请注意如果你不设置键然后SQLCipher将工作等同于一个标准的SQLite数据库。
在应用程序连接起来使用SQLCipher采取偷看产生的数据文件以确保一切妥当。下的下列十六进制转储看起来像一个普通的SQLite数据库。需要注意的是文件类型模式和数据清晰可读。
十六进制转储-C plaintext.db
00000000 53 51 4C 69 74 65 20 66 6F 72 6D 61 74 20 33 00 | SQLite的格式3。|
00000010 04 00 01 01 00 40 20 20 00 00 00 04 00 00 00 00 | ... ........ |
...
000003B0 00 00 00 00 24 02 06 17 11 11 01 35 74 61 62 6C | .... $ ...... 5tabl |
000003c0 65 74 32 74 32 03 43 52 45 41 54 45 20 54 41 42 | et2t2.CREATE TAB |
000003d0 4C 45 20 74 32 28 61 62 29 24 01 06 17 11 11 | LE T2AB$ ..... | 2C
000003e0 01 35 74 61 62 6C 65 74 31 74 31 02 43 52 45 41 | 0.5 tablet1t1.CREA
000003f0 54 45 20 54 41 42 4C 45 20 74 31 28 61 2C 62 29 | TE表t1AB|
...
000007d0 00 00 00 14 02 03 01 2D 02 74 77 6F 20 66 6F 72 | ....... -。2 |
000007e0 20 74 68 65 20 73 68 6F 77 15 01 03 01 01 2F 6F | show... / .o |
000007f0 6E 65 20 66 6F 72 20 74 68 65 20 6D 6F 6E 65 79 | NE的钱|
火起来的SQLCipher的应用程序在模拟器中的应用程序下的数据库文件/用户/ sjlombardo /图书馆/应用程式支援/ iPhone Simulator/5.0/Applications的/ /文件。尝试运行应用程序数据库的十六进制转储。随着SQLCipher的输出应该看起来完全是随机的没有挑剔的特性在所有。
十六进制转储-C sqlcipher.db
00000000 1B 3C E3 AA 31 71 AE 39 6D 06 F6 21 63 85 A6 AE | 0.1 00000010 70 91 3E F5 A5 03 E5 B3 32 67 2E 82 18 97 5A。第.....2克.... Z | 00000020 34 D8 65 95 EB 17 10 47 A7 5E 23 20 21 21 D4的D1 | 4.E. ... G. ^.. | ... EA 0D 000007d0 AF E8 21 4F 44 FE 15 B7 C2 EE约94 7B 0B | .... OD ..... {... | 000007e0 29 8B 72 21 E9 91 93 1D D4 3C 99 FC AA 64 D2 55R ..... <...杜| 000007f0 D5 E9 3F 91 18 A9 C5 4B 25 CB 84 86 82 0A 08 7F | ........ K....... | 00000800 参见 所有应用程序使用的加密算法包括那些使用SQLCipher或iOS的内部库像CommonCrypto和钥匙扣必须提供文件以苹果演示了审查工商局商务部DOC和安全性BIS和分类应用在大众市场加密项。 PBKDF2密钥导出函数的信息请访问http://en.wikipedia.org/wiki/PBKDF2