前言:由于新項(xiàng)目中大量數(shù)據(jù)操作都和數(shù)據(jù)庫(kù)有關(guān),因此決定給數(shù)據(jù)庫(kù)進(jìn)行套殼加密,防止數(shù)據(jù)庫(kù)被串改或者被有心人查看,對(duì)比再三決定使用免費(fèi)的SQLCipher進(jìn)行加密。
本文是在作者使用mac終端生成加密數(shù)據(jù)庫(kù),使用方法以及踩過的坑都會(huì)在本文中一一說明
SQLCipher 下載鏈接
SQLCipher 官方文檔
20200612更新
對(duì)于最新版的官網(wǎng)下載的sqlcipher,安裝的時(shí)候需要如下命令
libcryptoPath和prefixPath需要替換為自己的對(duì)應(yīng)路徑
./configure --enable-tempstore=yes --disable-tcl --with-crypto-lib=none CFLAGS="-mmacosx-version-min=10.7 -DSQLITE_HAS_CODEC -DSQLITE_TEMP_STORE=2 -DSQLCIPHER_CRYPTO_OPENSSL -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_FTS3_PARENTHESIS -DSQLITE_ENABLE_FTS5 -DNOCRYPT -I/openssllib/include" LDFLAGS="libcryptoPath" CC=clang --prefix= prefixPath
make
libcryptoPath作者的路徑是/usr/local/Cellar/openssl/1.0.2s/lib/libcrypto.a
prefixPath作者的路徑是/usr/local/Cellar/openssl/1.0.2s/lib
SQLCipher下載成功之后放到桌面,打開終端,cd到當(dāng)前目錄下,執(zhí)行
- 復(fù)制大法$ ./configure --enable-tempstore=yes CFLAGS="-DSQLITE_HAS_CODEC"
LDFLAGS="-lcrypto"
2.作者在執(zhí)行這句話的時(shí)候遇到了一個(gè)問題(sqlite3.c:18280:10: fatal error: 'openssl/rand.h' file not found)如果您沒有遇到可直接忽略
3.對(duì)于出現(xiàn)(sqlite3.c:18280:10: fatal error: 'openssl/rand.h' file not found)的解決辦法是繼續(xù)在終端執(zhí)行$ ./configure --enable-tempstore=yes CFLAGS="-DSQLITE_HAS_CODEC"
LDFLAGS="/opt/local/lib/libcrypto.a"問題即可解決
4.如果提示sqlcipher找不到,則需要更新 brew install sqlcipher
5.make
以上過程走完,SQLCipher就配置好可以直接使用了,使用方法以官網(wǎng)教程為準(zhǔn),本文只做舉例說明
前置工作,把需要加密的數(shù)據(jù)庫(kù)原件放入到剛才下載的sqlcipher-master同一目錄下,
使用方法
1.cd 到當(dāng)前目錄(sqlcipher-master目錄)
- ./sqlcipher plaintext.db(plaintext.db為你需要加密的數(shù)據(jù)庫(kù),出現(xiàn).help警告不用管,繼續(xù)往下執(zhí)行)
3.sqlite> ATTACH DATABASE 'encrypted.db' AS encrypted KEY 'testkey';(加密密鑰)
4.sqlite> SELECT sqlcipher_export('encrypted');
5.sqlite> DETACH DATABASE encrypted;
正常來說到這里數(shù)據(jù)庫(kù)加密就已經(jīng)完成了,生成的encrypted.db就是加密過后的db,可是作者在把加密后的db放入工程時(shí)發(fā)現(xiàn),一直提示數(shù)據(jù)庫(kù)已被加密,(已使用對(duì)應(yīng)解密方法).原因無(wú)它。作者在此嘗試修改已加密數(shù)據(jù)庫(kù)的密碼和cipher_page_size,最終解決該問題
解決方法
- ./sqlcipher encrypted.db(當(dāng)前已經(jīng)加密過的數(shù)據(jù)庫(kù))
2.sqlite> PRAGMA key = 'testkey';(原始密碼)
3.sqlite> ATTACH DATABASE 'newdb.db' AS newdb KEY 'newkey';(修改密碼,同時(shí)創(chuàng)建一個(gè)新的加密db)
4.sqlite> PRAGMA newdb.cipher_page_size = 4096;(iOS端通用4096)
5.sqlite> SELECT sqlcipher_export('newdb');
6.sqlite> DETACH DATABASE newdb;