介紹:
使用SQLite數據庫的時候,有時候對于數據庫要求比較高,特別是在iOS8.3之前,未越獄的系統也可以通過工具拿到應用程序沙盒里面的文件,這個時候我們就可以考慮對SQLite數據庫進行加密,這樣就不用擔心sqlite文件泄露了
通常數據庫加密一般有兩種方式
1對所有數據進行加密
2對數據庫文件加密
第一種方式雖然加密了數據,但是并不完全,還是可以通過數據庫查看到表結構等信息,并且對于數據庫的數據,數據都是分散的,要對所有數據都進行加解密操作會嚴重影響性能,通常的做法是采取對文件加密的方式
iOS免費版的sqlite庫并不提供了加密的功能,SQLite只提供了加密的SQLite,但并沒有實現,iOS上支持的加密庫有下面幾種
The SQLite Encryption Extension (SEE)
收費,有以下幾種加密方式RC4
AES-128?in?OFB?mode AES-128?in?CCM?mode AES-256?in?OFB?mode SQLiteEncrypt
收費,使用AES加密
SQLiteCrypt
收費,使用256-bit AES加密
SQLCipher
開源,托管在github上,實現了SQLite官方的加密接口,也加了一些新的接口,詳情參見這里
前三種都是收費的,SQLCipher是開源的,這里我們使用SQLCipher。
SQLCipher有免費有收費兩款,下面是官網給出的區別:
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)
解析:
只是集成起來更簡單,不用再添加OpenSSL依賴庫,而且編譯速度更快,從功能上來說沒有任何區別。僅僅為了上述一點便利去花費幾百美刀,對于我等苦逼RD來說太不值了,還好有一個免費版本。
sqlite是一款開源的輕量級數據庫,現在android和ios都在使用它來存儲結構化數據,但是加密版的并非開源。折中一下只能找開源的解決方案,sqlcipher是一個不錯的選擇,它可以對sqlite實現加密,并且有在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導入到工程中作為SQLite庫
.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,修改后不利于SQLite的統一管理和SQLite。我們可以直接將靜態庫文件導入到工程中,然后配置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錯誤碼SQLITE_NOTADB。
在sqlite3_open打開數據庫成功,而且用sqlite3_key輸入密碼以后,就可以正常的對數據庫進行增、刪、改、查等操作了。
【相關推薦】
1.?SQLite
2.?SQLite
3. SQLite