SQLCipher數據庫加解密

介紹:

使用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’ //自己查看需要的版本

如果是手動的話,如下操作:

一,需要到https://www.zetetic.net/sqlcipher/ios-tutorial/

把sqlcipher-master下載,把其中的.xcodeproj導入到工程中作為靜態庫

.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文件導入

.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源碼,這里有一份拓展,供參考:

FMDB源碼加密拓展

這個是我的demo可以到這里下載:https://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輸入密碼以后,就可以正常的對數據庫進行增、刪、改、查等操作了。

參考:

1,http://foggry.com/blog/2014/05/19/jia-mi-ni-de-sqlite/

2,https://www.zetetic.net/sqlcipher/documentation/

3,加密算法相關知識


上面是我個人遇到問題后,修修補補湊湊出來的,見笑見笑。

有問題大家可以討論。

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

推薦閱讀更多精彩內容