介紹:
使用SQLite數(shù)據(jù)庫(kù)的時(shí)候,有時(shí)候?qū)τ跀?shù)據(jù)庫(kù)要求比較高,特別是在iOS8.3之前,未越獄的系統(tǒng)也可以通過(guò)工具拿到應(yīng)用程序沙盒里面的文件,這個(gè)時(shí)候我們就可以考慮對(duì)SQLite數(shù)據(jù)庫(kù)進(jìn)行加密,這樣就不用擔(dān)心sqlite文件泄露了
通常數(shù)據(jù)庫(kù)加密一般有兩種方式
1對(duì)所有數(shù)據(jù)進(jìn)行加密
2對(duì)數(shù)據(jù)庫(kù)文件加密
第一種方式雖然加密了數(shù)據(jù),但是并不完全,還是可以通過(guò)數(shù)據(jù)庫(kù)查看到表結(jié)構(gòu)等信息,并且對(duì)于數(shù)據(jù)庫(kù)的數(shù)據(jù),數(shù)據(jù)都是分散的,要對(duì)所有數(shù)據(jù)都進(jìn)行加解密操作會(huì)嚴(yán)重影響性能,通常的做法是采取對(duì)文件加密的方式
iOS免費(fèi)版的sqlite庫(kù)并不提供了加密的功能,SQLite只提供了加密的SQLite,但并沒(méi)有實(shí)現(xiàn),iOS上支持的加密庫(kù)有下面幾種
The SQLite Encryption Extension (SEE)
收費(fèi),有以下幾種加密方式RC4
AES-128?in?OFB?mode AES-128?in?CCM?mode AES-256?in?OFB?mode SQLiteEncrypt
收費(fèi),使用AES加密
SQLiteCrypt
收費(fèi),使用256-bit AES加密
SQLCipher
開(kāi)源,托管在github上,實(shí)現(xiàn)了SQLite官方的加密接口,也加了一些新的接口,詳情參見(jiàn)這里
前三種都是收費(fèi)的,SQLCipher是開(kāi)源的,這里我們使用SQLCipher。
SQLCipher有免費(fèi)有收費(fèi)兩款,下面是官網(wǎng)給出的區(qū)別:
easier?to?setup,?saving?many?steps?in?project?configuration pre-built?with?a?modern?version?of?OpenSSL,?avoiding?another?externaldependency much?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)
解析:
只是集成起來(lái)更簡(jiǎn)單,不用再添加OpenSSL依賴庫(kù),而且編譯速度更快,從功能上來(lái)說(shuō)沒(méi)有任何區(qū)別。僅僅為了上述一點(diǎn)便利去花費(fèi)幾百美刀,對(duì)于我等苦逼RD來(lái)說(shuō)太不值了,還好有一個(gè)免費(fèi)版本。
sqlite是一款開(kāi)源的輕量級(jí)數(shù)據(jù)庫(kù),現(xiàn)在android和ios都在使用它來(lái)存儲(chǔ)結(jié)構(gòu)化數(shù)據(jù),但是加密版的并非開(kāi)源。折中一下只能找開(kāi)源的解決方案,sqlcipher是一個(gè)不錯(cuò)的選擇,它可以對(duì)sqlite實(shí)現(xiàn)加密,并且有在android和ios都有相應(yīng)的庫(kù)進(jìn)行解密讀取,,只是引入的庫(kù)會(huì)增加app的大小。SQLCipher is an open source library that provides transparent, secure 256-bit AES encryption of SQLite database files.
集成
如果你使用cocoapod的話就不需要自己配置了,為了方便,我們直接使用FMDB進(jìn)行操作數(shù)據(jù)庫(kù),F(xiàn)MDB也支持SQLCipher
pod
‘FMDB/SQLCipher’, ‘~> 2.6.2’ //自己查看需要的版本
如果是手動(dòng)的話,如下操作:
一,需要到www.zetetic.net/sqlcipher/ios-tutorial/
把sqlcipher-master下載,把其中的.xcodeproj導(dǎo)入到工程中作為SQLite庫(kù)
.xcodeproj文件
這個(gè)是SQLCipher加密靜態(tài)模塊;
二,配置Xcode
通過(guò)宏(SQLITE_HAS_CODEC)來(lái)配置SQLite是否開(kāi)啟加密模塊,我們需要在Xcode中配置開(kāi)啟加密模塊組件的宏,本文介紹CocoaPods方式的則不用配置。
(1)target -> Build Setting -> Other C Flags添加-DSQLITE_HAS_CODEC、-DSQLITE_TEMP_STORE=2、-DSQLITE_THREADSAFE、-DSQLCIPHER_CRYPTO_CC幾項(xiàng)配置。
如果不配置SQLITE_HAS_CODEC setKey:方法不會(huì)加密
(2)target -> Build Setting -> Other Linker Flags添加-framework Security配置。
(3)在TARGETS中把libsqlcipher.a文件導(dǎo)入
.a文件
三,添加加密代碼
打開(kāi)數(shù)據(jù)庫(kù)
一般是在數(shù)據(jù)庫(kù)open之后就用這個(gè)setKey方法。
說(shuō)明:
1.如果項(xiàng)目中原來(lái)有FMDB,不推薦直接引入FMDB/SQLCipher,修改后不利于SQLite的統(tǒng)一管理和SQLite。我們可以直接將靜態(tài)庫(kù)文件導(dǎo)入到工程中,然后配置Xcode即可。簡(jiǎn)單來(lái)說(shuō)步驟如下:
(1)在你有FMDB的工程里,加入.xcodeproj文件
(2)在工程的build setting里修改兩個(gè)配置
一個(gè)是other c flags,如上面圖的那個(gè)other c flags
一個(gè)是other link flags,入上圖那個(gè)other lilnk flags
然后FMDatabase的setkey方法就可以用了,在打開(kāi)數(shù)據(jù)庫(kù)后,調(diào)用此方法,數(shù)據(jù)庫(kù)文件就加密可以了。
說(shuō)到怎么在不改變?cè)瓉?lái)的FMDB源碼,這里有一份拓展,供參考:
FMDB源碼加密拓展
這個(gè)是我的demo可以到這里下載:pan.baidu.com/s/1o8fNHay
說(shuō)明:
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被設(shè)置,SQLCipher將會(huì)自動(dòng)加密數(shù)據(jù)庫(kù)所有數(shù)據(jù)。
需要注意的是,在使用sqlite3_open打開(kāi)或創(chuàng)建一個(gè)數(shù)據(jù)庫(kù),在對(duì)數(shù)據(jù)庫(kù)做任何其它操作之前,都必須先使用sqlite3_key輸入密碼,否則會(huì)導(dǎo)致SQLite失敗,報(bào)出sqlite錯(cuò)誤碼SQLITE_NOTADB。
在sqlite3_open打開(kāi)數(shù)據(jù)庫(kù)成功,而且用sqlite3_key輸入密碼以后,就可以正常的對(duì)數(shù)據(jù)庫(kù)進(jìn)行增、刪、改、查等操作了。
【相關(guān)推薦】
1.?SQLite
2.?SQLite
3. SQLite