在iOS應用程序開發中經常需要使用SQLite來存儲數據,很多時候需要加密保存一部分的數據。常見的做法是將要存儲的內容先加密然后存到數據庫中,使用的時候將數據進行解密,這樣就會有大量的性能消耗在數據的加解密上(性能主要取決于加解密的算法和CPU的能力)。
SQLCipher is an open source extension to SQLite that provides transparent 256-bit AES encryption of database files.
SQLite本身是支持加密功能的(免費版本不提供加密功能,商業版本是支持加密模塊)。SQLCipher是一個開源的SQLite加密擴展,支持對db文件進行256位的AES加密。
集成SQLCipher
集成SQLCipher有有兩種方法一種是按照官方的方式一步步的執行,這里就不過多的介紹。配置過程很麻煩,推薦使用下面的方式集成。
1、獲取SQLite加密模塊(SQLCipher)
在終端(Terminal)中使用pod search FMDB
,在查詢的結果中可以看到有個FMDB/SQLCipher
的Sub spec。
sqlcipher-search-fmdb.png
如果使用FMDB和CocoaPods的話直接在你的Podfile中添加pod 'FMDB/SQLCipher'
sqlcipher-podfile.png
如果沒有使用CocoaPods的話建議還是安裝一個吧,或者是新建一個測試項目安裝FMDB和SQLCipher。安裝CocoaPods可以參考《使用CocoaPods管理iOS項目中的依賴庫》
2、導入SQLCipher
執行pod install
之后會自動獲取SQLCipher,其實SQLCipher只有兩個文件sqlite3.h
和sqlite3.m
。
拷貝sqlite3.h/sqlite3.m文件到項目中,如果使用CocoaPods方式獲取SQLCipher的話,這一步驟就不需要了。
3、配置Xcode設置項
通過查詢資料SQLite是否開啟加密模塊是通過宏(SQLITE_HAS_CODEC
)來配置的。那么就需要在Xcode中配置開啟SQLite加密組件的宏(如使用CocoaPods方式則不需要配置)。
sqlite-extension-marco.png
(1)target -> Build Setting -> Other C Flags添加-DSQLITE_HAS_CODEC、-DSQLITE_TEMP_STORE=2、-DSQLITE_THREADSAFE、-DSQLCIPHER_CRYPTO_CC幾項配置
(2)target -> Build Setting -> Other Linker Flags添加-framework Security配置
4、如何使用
(1)引入sqlite3加密模塊,然后在打開數據庫之后加入如下代碼
const char *key = [@"devzeng" UTF8String];sqlite3_key(_db, key, (int)strlen(key));
如下圖:
sqlcipher-sqlite3-open.png
說明:
1)如果沒有添加-DSQLITE_HAS_CODEC配置上面的代碼會報錯
2)sqlite3_key函數需要指定加密使用的key,推薦使用UUID(可以進行salt處理)并存儲到KeyChain中。
3)如使用FMDB,可以在FMDB的open方法之后添加上面的兩行代碼。
(2)使用了加密模塊在提交到App Store時需要指明,具體的操作方法可以參考StackOverflow上面的做法。Does my application “contain encryption”?
參考資料
1、《Adding SQLCipher to Xcode Projects》
2、《ios開發FMDB導入SQLCipher加密數據庫》
3、《SQLite數據庫加密研究》