工程用得FMDB做數據庫的操作,後期要對數據庫做加密,這裡有兩種方法:
1.對數據庫內容加密,存的時候加密,用得時候解密。
2.直接對數據庫文件加密。
這裡我選擇了第二種,原因不細說,自己決定。
百度後,決定用SQLCipher,而且FMDB是支持SQLCipher的,官方配置說明地址 http://sqlcipher.net/ios-tutorial/ ,然後嘗試,配置失敗,而且使app包加大了很多兆,所以
不推薦。
後來在FMDB官方發現了這個:
<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+ICAgICAgvLS/ydLU08Njb2NvYXBvZHPAtLCy17DWp7PWU1FMQ2lwaGVyvNPD3Mr9vt2/4rXERk1EQrD8o6zI57n7xPrDu9PDuf1jb2NvYXBvZHOwstewuf212sj9t72/qtS0v+KjrNXiwO/Nxrz20ru49r3Ms8yjrLrcz+o8L3A+CjxwPs+4o7podHRwOi8vY29kZTRhcHAuY29tL2FydGljbGUvY29jb2Fwb2RzLWluc3RhbGwtdXNhZ2U8L3A+CjxwPiAgICAgILW91eLA787Sw8fL+df2tcS+zcrH0qqw0SBGTURCL1NRTENpcGhlciAg08Njb2NvYXBvZHMgsLLXsLW919S8urXEuaSzzMDvoaM8L3A+CjxwPiAgICAgILzytaXX9reovs3Kx6OovdPPwsC0tcSyvdbotcTHsMzhysfE47XEtefE1MnPsLLXsMHLY29jb2Fwb2Rzo6zH687xsdiwtNXVyc/D5sG0vdO1xL3Ms8zF5NbDusOjrLfx1PLPwsPmsr3W6Lvhyqew3KOpo7o8L3A+CjxwPiAgICAgIDEu1NrE+tfUvLq1xLmks8zEv8K8z8LQwr2o0ru49s7EvP5Qb2RmaWxlo6y08r+q1tW2yyAgIMrkyOvD/MHu0NAgICQgdmkgUG9kZmlsZSAgLCDIu7rz0LTI6yAgIHBvZCChrkZNREIvU1FMQ2lwaGVyIKGvo6wgyLu687GjtObNy7P2PC9wPgo8cD4gICAgICAyLsP8we7Q0NaxvdMgyuTI6yAgJHBvZCB1cGRhdGUgLjwvcD4KPHA+ICAgICAgyLu687XItP3WsbW9s/bP1qO6PC9wPgo8cD4gICAgICA8L3A+CjxwcmUgY2xhc3M9"brush:java;">Analyzing dependencies
Downloading dependencies
Installing FMDB (2.3)
Generating Pods project
Integrating client project
[!] From now on use `SqliteHasCcode.xcworkspace`.
類似這樣的提示出現,標示安裝成功,然後目錄會變成類似這個樣子:
之後進入工程都要點這個 .xcworkspace,進入後會是這個樣子:
之後添加加密代碼:
我是直接在FMDatabase.m裡加的,這個看個人代碼需要加的地方加就ok,一般是在數據庫open之後就用這個 setKey 方法。
然後編譯,運行,不出意外是OK得,用第三方數據庫管理工具驗證是否加密,當導入加了密的數據庫的時候,會直接提示 ‘數據是加密的’ 類似的話,如果用命令行的sqlite3 打開的話,是可以打開的,但是當用 .table 查看的時候,是看不見任何表的,入下圖:
但事實上,這個數據庫是有表有內容的, 這樣就防止了我們數據庫的數據外洩。
接下來是另一個重點:
用cocoapods安裝後,其實是往我們的工程裡添加了另外一個工程Pods,個人感覺很不爽,於是決定,把它融合到我的工程裡。
先看一下我移成功後的另一個工程的結構(這個工程原來就是有fmdb工程文件的,但是不能加密,我的目的就是要把fmdb搞成支持加密的,應該很多人的工程都是要這個場景吧):
不像是cocoapods 安裝的那樣,有兩個proj,從文件上來說,只多了sqlite3.h 和 sqlite3.m,然後FMDB文件還是你原來用得。這是我們最終要實現的樣子,好了,亂入完畢。
開始:
仔細看用cocoapods 安裝後的工程結構:
其實和我們平常用得FMDB相比較,只是多了SQLCipher的這塊的支持,那麼我們只要想辦法,把這塊單獨移到我們之前已經有FMDB得工程裡就可以了
SQLCipher目錄下,有兩個子目錄,Support Files是配置文件,common是主代碼文件。
common下得兩個文件,直接拖入到我們的工程即可,然後關鍵是這裡的配置:
1.pods-SQLCipher.xcconfig:
看到嘛,OTHER_CFLAGS 和 OTHER_LDFLAGS 分別對應工程裡build settings的:
Other c Flags :
這個主要是一些編譯宏。
和other Linker Flags
-framework 和 Security 是兩個,是分開的,別搞成一個了。
按pods-SQLCipher.xcconfig 配置文件裡的配置把這兩個地方改過來,如上圖.
2.pods-SQLCipher-Private.xcconfig
這裡的配置其實沒什麼要改的
GCC_PREPROCESSOR_DEFINITIONS 應該是設置編譯器的一些什麼,後面設為了COCOAPODS = 1, 我們就是為了去掉cocoapod的安裝形式的,所以我感覺這個配置我們不用理,所以我也沒有管。
HEADER_SEARCH_PATHS ,不用配置,因為我們後來只加了sqlite3.h, 和sqlite3.m 在我們的工程目錄下,到時候只要包含 #import “sqlite3.h” 就ok
OTHER_CFLAGS 和 OTHER_LDFLAGS 和PODS_ROOT 其實就是用得pods-SQLCipher.xcconfig裡的這幾個的設置,所以pods-SQLCipher.xcconfig設置好這裡也就好了。
因為用cocoapods安裝後,這裡的這些配置是要使SQLCipher工程和主工程的一些配置統一的,所以在移掉cocoapods安裝的形式後,就不用管這些了。
其實簡單步驟就是:
1.在你有fmdb的工程裡,加入sqlite3.h 和 sqlite3.m
2.在工程的build setting裡修改兩個配置
一個是other c flags ,如上面圖的那個 other c flags
一個是 other link flags , 入上圖那個other lilnk flags
然後FMDatabase 的 setkey 方法就可以用了,在打開數據庫後,調用此方法,數據庫文件就加密ok了。