天天看點

FMDB/SQLCipher資料庫加密

在iOS開發過程中經常需要用到SQLite來存儲資料,由于Apple的沙盒機制,我們App的資料存儲在沙盒裡面,一般情況下無法拿到資料,但是iOS管理軟體iFunBox可以讀取到應用程式沙盒裡面的檔案,是以為了保證資料的安全性,我們需要對資料庫進行加密。

資料庫加密有兩種方式:

1.對所有資料進行加密

2.對資料庫檔案加密

對比以上兩種方式,第一種方式的常見做法是是将要存儲的内容先加密然後存到資料庫中,使用的時候将資料庫解密,但是這樣會消耗很多時間,大部分性能消耗在資料的加解密上,同時,第二種方式,SQLite本身支援加密功能(免費版的不支援) ,SQLCipher是一個開源的SQLite加密擴充,支援對db檔案進行256位的AES加密,通常我們會用FMDB這個工具庫,FMDB對原生的SQLite進行了封裝,提供了面向對象的方式對資料庫操作,同時FMDB 也提供了對 SQLCipher 的支援。

內建SQLCipher

編譯SQLCipher需要做一些配置,具體配置詳情見:https://www.zetetic.net/sqlcipher/ios-tutorial/,這裡我們使用cocoapod 引用 FMDB 和SQLCipher。
           

1.擷取SQLCipher加密子產品

Podfile中添加pod ‘FMDB/SQLCipher’。

FMDB/SQLCipher資料庫加密

2.導入SQLCipher

執行 pod install後自動擷取SQLCipher,SQLCipher隻有兩個檔案sqlite3.h、sqlite3.m,如果不是通過CocoaPods擷取SQLCipher子產品的話需要手動拷貝sqlite3.h、sqlite3.m檔案到工程中。

3.配置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幾項配置
           
FMDB/SQLCipher資料庫加密
(2)target -> Build Setting -> Other Linker Flags添加-framework Security配置
           
FMDB/SQLCipher資料庫加密

4.添加加密代碼

FMDB/SQLCipher資料庫加密

說明:

如果項目中原來有FMDB,不推薦直接引入FMDB/SQLCipher,修改後不利于類庫的統一管理和更新。我們可以直接将sqlite3.h、sqlite3.m檔案拖到工程中,然後配置Xcode即可。簡單來說步驟如下:

(1)在你有FMDB的工程裡,加入sqlite3.h 和 sqlite3.m

(2)在工程的build setting裡修改兩個配置

一個是other c flags ,如上面圖的那個 other c flags

一個是 other link flags , 入上圖那個other lilnk flags

然後FMDatabase 的 setkey 方法就可以用了,在打開資料庫後,調用此方法,資料庫檔案就加密可以了。

參考資料:

《對FMDB加密-SQLCipher如何使用》