sqlite應(yīng)用幾乎在所有的App都能看到,雖然我們的數(shù)據(jù)存儲在沙盒里面,一般情況下無法拿到,但是iOS管理軟件(如:iFunBox)可以讀取到應(yīng)用程序沙盒里面的文件,為了提高數(shù)據(jù)的安全性,我們需要考慮對數(shù)據(jù)庫進行加密
數(shù)據(jù)庫加密一般有兩種方式
1、對所有數(shù)據(jù)進行加密
2、對數(shù)據(jù)庫文件加密
處于客戶端性能的考慮,通常我們對數(shù)據(jù)庫文件進行加密,在iOS上用的比較多的是 sqlcipher,由于原生提供的sqlite API是C語言實現(xiàn)的,通常我們會用一個在github上比較有名的一個工具庫FMDB,F(xiàn)MDB對原生的sqlite進行了封裝,提供了面向?qū)ο蟮姆绞綄?shù)據(jù)庫操作,同時FMDB 也提供了對 sqlcipher 的支持
下面基于 FMDB 和 sqlcipher 演示數(shù)據(jù)庫加解密
編譯sqlcipher需要做一些配置,具體配置詳情見:https://www.zetetic.net/sqlcipher/ios-tutorial/
我們通過 cocoapod 引用 FMDB 和sqlcipher 我們可以直接拿到編譯好的.a文件,直接用就可以
1、通過cocoapod 引用庫
pod 'FMDB/SQLCipher', '~> 2.5'
如果項目已經(jīng)引用了FMDB,改為FMDB/SQLCipher 重新install一次即可,通過cocoapod添加的FMDB默認還是沒有加密的,要使用加密的功能,需要在數(shù)據(jù)庫open后調(diào)用setKey方法設(shè)置key,如下:
關(guān)鍵代碼:[self setKey:encryptKey_];
2、添加數(shù)據(jù)庫加密操作類
上面代碼是FMDatabase中的,CocoaPod添加的庫不推薦修改,修改后不利于類庫的統(tǒng)一管理和更新
有些人則不用cocoapod引用FMDB,而是直接把FMDB的源文件拷貝到項目中,然后進行修改,我更傾向與保留cocoapod對FMDB的管理,通過新增類提供對數(shù)據(jù)庫加密的支持,這里新增兩個類:FMEncryptDatabase 和 FMEncryptDatabaseQueue
我們可以重用 FMDatabase 和 FMDatabaseQueue 的邏輯,所以我們可以繼承自他們,同時我再FMEncryptDatabase 中提供兩個數(shù)據(jù)庫遷移的方法,可以把未加密的數(shù)據(jù)庫轉(zhuǎn)換為加密的數(shù)據(jù)庫,也可以反向轉(zhuǎn)換
由于secretKey一般只需要一份,所以這里使用一個靜態(tài)變量實現(xiàn),如果需要修改,可以在AppDelegate的 application:didFinishLaunchingWithOptions: 方法進行設(shè)置:
3、測試
好了,通過上面兩個類創(chuàng)建的數(shù)據(jù)庫都是加密過的,下面做一些測試,具體代碼見后面的demo:
4、Demo