在iOS應(yīng)用程序開發(fā)中經(jīng)常需要使用SQLite來存儲數(shù)據(jù)尸曼,很多時候需要加密保存一部分的數(shù)據(jù)八回。常見的做法是將要存儲的內(nèi)容先加密然后存到數(shù)據(jù)庫中,使用的時候?qū)?shù)據(jù)進行解密吩坝,這樣就會有大量的性能消耗在數(shù)據(jù)的加解密上(性能主要取決于加解密的算法和CPU的能力)毒姨。
SQLCipher is an open source extension to SQLite that provides transparent 256-bit AES encryption of database files.
SQLite本身是支持加密功能的(免費版本不提供加密功能,商業(yè)版本是支持加密模塊)钉寝。SQLCipher是一個開源的SQLite加密擴展弧呐,支持對db文件進行256位的AES加密闸迷。
集成SQLCipher
集成SQLCipher有有兩種方法一種是按照官方的方式一步步的執(zhí)行,這里就不過多的介紹俘枫。配置過程很麻煩腥沽,推薦使用下面的方式集成。
1鸠蚪、獲取SQLite加密模塊(SQLCipher)
在終端(Terminal)中使用pod search FMDB
今阳,在查詢的結(jié)果中可以看到有個FMDB/SQLCipher
的Sub spec。
如果使用FMDB和CocoaPods的話直接在你的Podfile中添加pod 'FMDB/SQLCipher'
如果沒有使用CocoaPods的話建議還是安裝一個吧茅信,或者是新建一個測試項目安裝FMDB和SQLCipher盾舌。安裝CocoaPods可以參考《使用CocoaPods管理iOS項目中的依賴庫》
2、導(dǎo)入SQLCipher
執(zhí)行pod install
之后會自動獲取SQLCipher汹押,其實SQLCipher只有兩個文件sqlite3.h
和sqlite3.m
矿筝。
拷貝sqlite3.h/sqlite3.m文件到項目中,如果使用CocoaPods方式獲取SQLCipher的話棚贾,這一步驟就不需要了窖维。
3、配置Xcode設(shè)置項
通過查詢資料SQLite是否開啟加密模塊是通過宏(SQLITE_HAS_CODEC
)來配置的妙痹。那么就需要在Xcode中配置開啟SQLite加密組件的宏(如使用CocoaPods方式則不需要配置)铸史。
(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加密模塊耿芹,然后在打開數(shù)據(jù)庫之后加入如下代碼
const char *key = [@"devzeng" UTF8String];sqlite3_key(_db, key, (int)strlen(key));
如下圖:
說明:
1)如果沒有添加-DSQLITE_HAS_CODEC配置上面的代碼會報錯
2)sqlite3_key函數(shù)需要指定加密使用的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開發(fā)FMDB導(dǎo)入SQLCipher加密數(shù)據(jù)庫》
3砂碉、《SQLite數(shù)據(jù)庫加密研究》