分享SQLCipher數(shù)據(jù)庫如何加解密
發(fā)表時間:2023-08-31 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]介紹:使用SQLite數(shù)據(jù)庫的時候,有時候?qū)τ跀?shù)據(jù)庫要求比較高,特別是在iOS8.3之前,未越獄的系統(tǒng)也可以通過工具拿到應(yīng)用程序沙盒里面的文件,這個時候我們就可以考慮對SQLite數(shù)據(jù)庫進行加密,這樣就不用擔(dān)心sqlite文件泄露了通常數(shù)據(jù)庫加密一般有兩種方式1對所有數(shù)據(jù)進行加密2對數(shù)據(jù)庫文件加密...
介紹:
使用SQLite數(shù)據(jù)庫的時候,有時候?qū)τ跀?shù)據(jù)庫要求比較高,特別是在iOS8.3之前,未越獄的系統(tǒng)也可以通過工具拿到應(yīng)用程序沙盒里面的文件,這個時候我們就可以考慮對SQLite數(shù)據(jù)庫進行加密,這樣就不用擔(dān)心sqlite文件泄露了
通常數(shù)據(jù)庫加密一般有兩種方式
1對所有數(shù)據(jù)進行加密
2對數(shù)據(jù)庫文件加密
第一種方式雖然加密了數(shù)據(jù),但是并不完全,還是可以通過數(shù)據(jù)庫查看到表結(jié)構(gòu)等信息,并且對于數(shù)據(jù)庫的數(shù)據(jù),數(shù)據(jù)都是分散的,要對所有數(shù)據(jù)都進行加解密操作會嚴重影響性能,通常的做法是采取對文件加密的方式
iOS免費版的sqlite庫并不提供了加密的功能,SQLite只提供了加密的接口,但并沒有實現(xiàn),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上,實現(xiàn)了SQLite官方的加密接口,也加了一些新的接口,詳情參見這里
前三種都是收費的,SQLCipher是開源的,這里我們使用SQLCipher。
SQLCipher有免費有收費兩款,下面是官網(wǎng)給出的區(qū)別:
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依賴庫,而且編譯速度更快,從功能上來說沒有任何區(qū)別。僅僅為了上述一點便利去花費幾百美刀,對于我等苦逼RD來說太不值了,還好有一個免費版本。
sqlite是一款開源的輕量級數(shù)據(jù)庫,現(xiàn)在android和ios都在使用它來存儲結(jié)構(gòu)化數(shù)據(jù),但是加密版的并非開源。折中一下只能找開源的解決方案,sqlcipher是一個不錯的選擇,它可以對sqlite實現(xiàn)加密,并且有在android和ios都有相應(yīng)的庫進行解密讀取,,只是引入的庫會增加app的大小。SQLCipher is an open source library that provides transparent, secure 256-bit AES encryption of SQLite database files.
集成
如果你使用cocoapod的話就不需要自己配置了,為了方便,我們直接使用FMDB進行操作數(shù)據(jù)庫,F(xiàn)MDB也支持SQLCipher
pod
‘FMDB/SQLCipher’, ‘~> 2.6.2’ //自己查看需要的版本
如果是手動的話,如下操作:
一,需要到www.zetetic.net/sqlcipher/ios-tutorial/
把sqlcipher-master下載,把其中的.xcodeproj導(dǎo)入到工程中作為靜態(tài)庫
.xcodeproj文件
這個是SQLCipher加密靜態(tài)模塊;
二,配置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文件導(dǎo)入
.a文件
三,添加加密代碼
打開數(shù)據(jù)庫
一般是在數(shù)據(jù)庫open之后就用這個setKey方法。
說明:
1.如果項目中原來有FMDB,不推薦直接引入FMDB/SQLCipher,修改后不利于類庫的統(tǒng)一管理和更新。我們可以直接將靜態(tài)庫文件導(dǎo)入到工程中,然后配置Xcode即可。簡單來說步驟如下:
(1)在你有FMDB的工程里,加入.xcodeproj文件
(2)在工程的build setting里修改兩個配置
一個是other c flags,如上面圖的那個other c flags
一個是other link flags,入上圖那個other lilnk flags
然后FMDatabase的setkey方法就可以用了,在打開數(shù)據(jù)庫后,調(diào)用此方法,數(shù)據(jù)庫文件就加密可以了。
說到怎么在不改變原來的FMDB源碼,這里有一份拓展,供參考:
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被設(shè)置,SQLCipher將會自動加密數(shù)據(jù)庫所有數(shù)據(jù)。
需要注意的是,在使用sqlite3_open打開或創(chuàng)建一個數(shù)據(jù)庫,在對數(shù)據(jù)庫做任何其它操作之前,都必須先使用sqlite3_key輸入密碼,否則會導(dǎo)致數(shù)據(jù)庫操作失敗,報出sqlite錯誤碼SQLITE_NOTADB。
在sqlite3_open打開數(shù)據(jù)庫成功,而且用sqlite3_key輸入密碼以后,就可以正常的對數(shù)據(jù)庫進行增、刪、改、查等操作了。
【相關(guān)推薦】
1. 免費mysql在線視頻教程
2. MySQL最新手冊教程
3. 數(shù)據(jù)庫設(shè)計那些事
以上就是分享SQLCipher數(shù)據(jù)庫如何加解密的詳細內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!
學(xué)習(xí)教程快速掌握從入門到精通的SQL知識。