介紹:
使用SQLite資料庫的時候,有時候對於資料庫需求比較高,特別是在iOS8 .3之前,未越獄的系統也可以透過工具拿到應用程式沙盒裡面的文件,這個時候我們就可以考慮對SQLite資料庫進行加密,這樣就不用擔心sqlite文件洩露了
通常資料庫加密一般有兩種方式
1對所有數據進行加密
2對資料庫文件加密
第一種方式雖然加密了數據,但是並不完全,還是可以透過資料庫查看到表結構等信息,並且對於資料庫的數據,資料都是分散的,要對所有資料都進行加解密操作會嚴重影響效能,通常的做法是採取對檔案加密的方式
iOS免費版的sqlite函式庫並不提供了加密的功能,SQLite只提供了加密的介面,但並沒有實現,iOS上支援的加密函式庫有以下幾種
The SQLite Encryption Extension (SEE)
收費,有以下幾種加密方式RC4
AES-128 in OFB mode AES-128 in CCM mode AES-256 in OFB mode SQLiteEncrypt
收費,使用AES加密
SQLiteCrypt
收費,使用256-bit AES加密
SQLCipher
開源,託管在github上,實現了SQLite官方的加密接口,也加了一些新的接口,詳情請參閱這裡
前三種都是要收費的,SQLCipher是開源的,這裡我們使用SQLCipher。
SQLCipher有免費有收費兩款,以下是官網給的區別:
easier to setup, saving many steps in project configuration pre-built with a modern version of OpenSSL, avoiding another externaldependency much faster for each build cycle becausethe library doesn't need to be built from scratch on each compile (build timecan be up to 95% faster with the static libraries)
解析:
只是整合起來比較簡單,不用再加入OpenSSL依賴函式庫,而且編譯速度更快,從功能上來說沒有任何差別。光是為了上述一點便利去花費幾百美刀,對於我等苦逼RD來說太不值了,還好有一個免費版本。
sqlite是一款開源的輕量級資料庫,現在android和ios都在使用它來儲存結構化數據,但是加密版的並非開源。折中一下只能找開源的解決方案,sqlcipher是一個不錯的選擇,它可以對sqlite實現加密,並且有在android和ios都有相應的庫進行解密讀取,,只是引入的庫會增加app的大小。 SQLCipher is an open source library that provides transparent, secure 256-bit AES encryption of SQLite database files.
#整合
如果你使用cocoapod的話就不需要自己配置了,為了方便,我們直接使用FMDB進行操作資料庫,FMDB也支援SQLCipher
pod
'FMDB/SQLCipher', '~> 2.6.2' //自己看所需的版本
如果是手動的話,如下操作:
一,需要到www.zetetic.net/sqlcipher/ios-tutorial/
把sqlcipher-master下載,把其中的.xcodeproj導入到工程中作為靜態庫
這個是SQLCipher加密靜態模組;
二,設定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幾項配置。
如果沒有設定SQLITE_HAS_CODEC setKey:方法不會加密
(2)target -> Build Setting -> Other Linker Flags新增-framework Security設定。
(3)在TARGETS中把libsqlcipher.a檔案匯入
三,加入加密程式碼
一般是在資料庫open之後就用這個setKey方法。
說明:
1.如果專案中原來有FMDB,不建議直接引入FMDB/SQLCipher,修改後不利於類別庫的統一管理和更新。我們可以直接將靜態庫檔案匯入到工程中,然後配置Xcode即可。簡單來說步驟如下:
(1)在你有FMDB的工程裡,加入.xcodeproj檔
(2)在工程的build setting裡修改兩個設定
#一個是other c flags,如上面圖的那個other c flags
一個是other link flags,入上圖那個other lilnk flags
然後FMDatabase的setkey方法就可以用了,在開啟資料庫後,呼叫此方法,資料庫檔案就加密可以了。
说到怎么在不改变原来的FMDB源码,这里有一份拓展,供参考:
这个是我的demo可以到这里下载:pan.baidu.com/s/1o8fNHay
说明:
In most cases SQLCipher uses PBKDF2, a salted and iteratedkey derivation function, to obtain the encryption key. Alternately, anapplication can tell SQLCipher to use a specific binary key in blob notation(note that SQLCipher requires exactly 256 bits of key material), i.e. PRAGMA key = "x'2DD29CA851E7B56E4697B0E1F08507293D761A05CE4D1B628663F411A8086D99'"; Once the key is set SQLCipher will automatically encryptall data in the database! Note that if you don't set a key then SQLCipher willoperate identically to a standard SQLite database.
一旦key被设置,SQLCipher将会自动加密数据库所有数据。
需要注意的是,在使用sqlite3_open打开或创建一个数据库,在对数据库做任何其它操作之前,都必须先使用sqlite3_key输入密码,否则会导致数据库操作失败,报出sqlite错误码SQLITE_NOTADB。
在sqlite3_open打开数据库成功,而且用sqlite3_key输入密码以后,就可以正常的对数据库进行增、删、改、查等操作了。
【相关推荐】
2. MySQL最新手册教程
3. 数据库设计那些事
以上是分享SQLCipher資料庫如何加解密的詳細內容。更多資訊請關注PHP中文網其他相關文章!