介绍:
使用SQLite数据库的时候,有时候对于数据库要求比较高,特别是在iOS8.3之前,未越狱的系统也可以通过工具拿到应用程序沙盒里面的文件,这个时候我们就可以考虑对SQLite数据库进行加密,这样就不用担心sqlite文件泄露了
通常数据库加密一般有两种方式
1对所有数据进行加密
2对数据库文件加密
第一种方式虽然加密了数据,但是并不完全,还是可以通过数据库查看到表结构等信息,并且对于数据库的数据,数据都是分散的,要对所有数据都进行加解密操作会严重影响性能,通常的做法是采取对文件加密的方式
iOS免费版的sqlite库并不提供了加密的功能,SQLite只提供了加密的接口,但并没有实现,iOS上支持的加密库有下面几种
The SQLite Encryption Extension (SEE)
收费,有以下几种加密方式RC4
AES-128 in OFB modeAES-128 in CCM modeAES-256 in OFB modeSQLiteEncrypt
收费,使用AES加密
SQLiteCrypt
收费,使用256-bit AES加密
SQLCipher
开源,托管在github上,实现了SQLite官方的加密接口,也加了一些新的接口,详情参见这里
前三种都是收费的,SQLCipher是开源的,这里我们使用SQLCipher。
SQLCipher有免费有收费两款,下面是官网给出的区别:
easier to setup, saving many steps in project configurationpre-built with a modern version of OpenSSL, avoiding another externaldependencymuch faster for each build cycle becausethe library doesn't need to be built from scratch on each compile (build timecan be up to 95% faster with the static libraries)
解析:
只是集成起来更简单,不用再添加OpenSSL依赖库,而且编译速度更快,从功能上来说没有任何区别。仅仅为了上述一点便利去花费几百美刀,对于我等苦逼RD来说太不值了,还好有一个免费版本。
sqlite是一款开源的轻量级数据库,现在android和ios都在使用它来存储结构化数据,但是加密版的并非开源。折中一下只能找开源的解决方案,sqlcipher是一个不错的选择,它可以对sqli本文来源gaodai#ma#com搞@@代~&码网^te实现加密,并且有在android和ios都有相应的库进行解密读取,,只是引入的库会增加app的大小。SQLCipher is an open source library that provides transparent, secure 256-bit AES encryption of SQLite database files.
集成
如果你使用cocoapod的话就不需要自己配置了,为了方便,我们直接使用FMDB进行操作数据库,FMDB也支持SQLCipher
pod
‘FMDB/SQLCipher’, ‘~> 2.6.2’ //自己查看需要的版本
如果是手动的话,如下操作:
一,需要到www.zetetic.net/sqlcipher/ios-tutorial/
把sqlcipher-master下载,把其中的.xcodeproj导入到工程中作为静态库
.xcodeproj文件
这个是SQLCipher加密静态模块;
二,配置Xcode
通过宏(SQLITE_HAS_CODEC)来配置SQLite是否开启加密模块,我们需要在Xcode中配置开启加密模块组件的宏,本文介绍CocoaPods方式的则不用配置。
(1)target -> Build Setting -> Other C Flags添加-DSQLITE_HAS_CODEC、-DSQLITE_TEMP_STORE=2、-DSQLITE_THREADSAFE、-DSQLCIPHER_CRYPTO_CC几项配置。
如果不配置SQLITE_HAS_CODEC setKey:方法不会加密
(2)target -> Build Setting -> Other Linker Flags添加-framework Security配置。
(3)在TARGETS中把libsqlcipher.a文件导入
.a文件
三,添加加密代码
打开数据库
一般是在数据库open之后就用这个setKey方法。
说明:
1.如果项目中原来有FMDB,不推荐直接引入FMDB/SQLCipher,修改后不利于类库的统一管理和更新。我们可以直接将静态库文件导入到工程中,然后配置Xcode即可。简单来说步骤如下:
(1)在你有FMDB的工程里,加入.xcodeproj文件
(2)在工程的build setting里修改两个配置
一个是other c flags,如上面图的那个other c flags
一个是other link flags,入上图那个other lilnk flags
然后FMDatabase的setkey方法就可以用了,在打开数据库后,调用此方法,数据库文件就加密可以了。
说到怎么在不改变原来的FMDB源码,这里有一份拓展,供参考:
FMDB源码加密拓展
这个是我的demo可以到这里下载:pan.baidu.com/s/1o8fNHay
说明:
In most cases SQLCipher uses PBKDF2, a salted and iteratedkey derivation function, to obtain the encryption key. Alternately, anapplication can tell SQLCipher to use a specific binary key in blob notation(note that SQLCipher requires exactly 256 bits of key material), i.e.PRAGMA key = "x'2DD29CA851E7B56E4697B0E1F08507293D761A05CE4D1B628663F411A8086D99'";Once the key is set SQLCipher will automatically encryptall data in the database! Note that if you don't set a key then SQLCipher willoperate identically to a standard SQLite database.
一旦key被设置,SQLCipher将会自动加密数据库所有数据。
需要注意的是,在使用sqlite3_open打开或创建一个数据库,在对数据库做任何其它操作之前,都必须先使用sqlite3_key输入密码,否则会导致数据库操作失败,报出sqlite错误码SQLITE_NOTADB。
在sqlite3_open打开数据库成功,而且用sqlite3_key输入密码以后,就可以正常的对数据库进行增、删、改、查等操作了。
【相关推荐】
1. 免费mysql在线视频教程
2. MySQL最新手册教程
3. 数据库设计那些事
以上就是分享SQLCipher数据库如何加解密的详细内容,更多请关注搞代码gaodaima其它相关文章!