數(shù)據(jù)庫加密一般有兩種方式
1蟆肆、對所有數(shù)據(jù)進(jìn)行加密
2肛宋、對數(shù)據(jù)庫文件加密
對比以上兩種方式州藕,第一種方式的常見做法是是將要存儲的內(nèi)容先加密然后存到數(shù)據(jù)庫中束世,使用的時候?qū)?shù)據(jù)庫解密,但是這樣會消耗很多時間床玻,大部分性能消耗在數(shù)據(jù)的加解密上毁涉,同時,第二種方式锈死,SQLite本身支持加密功能(免費版的不支持) 贫堰,SQLCipher是一個開源的SQLite加密擴(kuò)展,支持對db文件進(jìn)行256位的AES加密待牵,通常我們會用FMDB這個工具庫其屏,F(xiàn)MDB對原生的SQLite進(jìn)行了封裝,提供了面向?qū)ο蟮姆绞綄?shù)據(jù)庫操作缨该,同時FMDB 也提供了對 SQLCipher 的支持偎行。
集成SQLCipher
編譯SQLCipher需要做一些配置,具體配置詳情也可見:https://www.zetetic.net/sqlcipher/ios-tutorial/
1.下載 SQLCipher 文件?
2.將 sqlcipher.xcodeproj 添加到你的工程中
3.配置工程
在Build Settings 中贰拿,找到Search Paths 的 Header Search Paths 添加 $(PROJECT_DIR)/sqlcipher/src
4.在Other Linker Flags中蛤袒,添加 $(BUILT_PRODUCTS_DIR)/libsqlcipher.a
5.在Other C Flags中,添加 -DSQLITE_HAS_CODEC
6.在Build Phases 中 膨更,找到Target Dependencies 妙真,選擇?sqlcipher?添加
7.在Link Binary With Libraries中,選擇添加 libsqlcipher.a 類庫
8.在Link With Libraries中荚守,添加 Security.framework.
注意:
如果 libsqlite3.dylib 或者其他 SQLite framework 在你的Link Binary With Libraries 列表中艾栋,記得安全移除它。Repeat these steps for any other targets in your project that will depend on SQLCipher, i.e. unit tests.
集成代碼:
現(xiàn)在齿风,SQLCipher類庫并入項目中可以立即開始使用該庫了罩缴。SQLCipher加密數(shù)據(jù)庫是容易的:
@ 打開數(shù)據(jù)庫
@ 使用sqlite3_key功能提供關(guān)鍵材料。在大多數(shù)情況下缩功,這應(yīng)該發(fā)生在第一次操作后打開數(shù)據(jù)庫
@ 運行查詢來驗證數(shù)據(jù)庫可以被打開(即通過查詢方案)
@ 作為預(yù)防措施晴及,運行一個查詢,以確保應(yīng)用程序是我們使用SQLCipher在活動連接
在大多數(shù)情況下嫡锌,使用SQLCipher PBKDF2虑稼,一個加鹽迭代的密鑰導(dǎo)出函數(shù),獲取加密密鑰势木。應(yīng)用程序可以告訴SQLCipher在blob不使用特定的二進(jìn)制密鑰蛛倦,requires exactly 256 bits of key material
PRAGMA key = "x'2DD29CA851E7B56E4697B0E1F08507293D761A05CE4D1B628663F411A8086D99'";
一旦關(guān)鍵設(shè)置SQLCipher會自動加密所有數(shù)據(jù)的數(shù)據(jù)庫。注意啦桌,如果你不設(shè)置一個鍵然后SQLCipher操作相同一個標(biāo)準(zhǔn)的SQLite數(shù)據(jù)庫溯壶。
這里我們使用cocoapod 引用 FMDB 和SQLCipher及皂。
1.獲取SQLCipher加密模塊
Podfile中添加 pod 'FMDB/SQLCipher' ?或者 pod 'FMDB/SQLCipher', '~> 2.5'
2.導(dǎo)入SQLCipher
執(zhí)行 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幾項配置
2)target -> Build Setting -> Other Linker Flags添加-framework Security配置
4.添加加密代碼
一般是在數(shù)據(jù)庫open之后就用這個 setKey 方法弧满。
說明:
1. 如果項目中原來有FMDB,不推薦直接引入FMDB/SQLCipher此熬,修改后不利于類庫的統(tǒng)一管理和更新庭呜。我們可以直接將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 方法就可以用了,在打開數(shù)據(jù)庫后鲫寄,調(diào)用此方法吉执,數(shù)據(jù)庫文件就加密可以了。