使用SQLCipher加密SQLite數據庫

在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數據庫加密研究》

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 數據庫加密一般有兩種方式 1、對所有數據進行加密 2、對數據庫文件加密 對比以上兩種方式,第一種方式的常見做法是是...
    肉肉要次肉閱讀 3,537評論 0 1
  • 介紹: 使用SQLite數據庫的時候,有時候對于數據庫要求比較高,特別是在iOS8.3之前,未越獄的系統也可以通過...
    farawei閱讀 5,082評論 2 51
  • 在iOS開發過程中經常需要用到SQLite來存儲數據,由于Apple的沙盒機制,我們App的數據存儲在沙盒里面,...
    伍驍辛閱讀 4,442評論 8 15
  • 這篇文章介紹如何對數據庫文件進行加密,基于FMDB+SQLCipher,標明踩過的坑,留給同樣掉進坑里的小伙伴參考...
    7544eb39c4ac閱讀 6,618評論 3 28
  • 北京夢之翼傳統文化家塾 學子今日成長的力量 : 1,郝澤迎同學進...
    夢之翼教育的簡書閱讀 114評論 0 0