场景: 在iOS或安卓中,内置本地数据库可以提高使用的体验感,离线部分数据,但这些数据可能属于敏感数据,通过砸壳、逆向等方式可以窃取数据库并造成数据库的泄漏。
sqlcipher的安装【Mac】
Sqlcipher安装方式>>>
documentation
brew install sqlcipher
进入本地数据库所在目录
sqlcipher plaintext.db
加密
sqlite> ATTACH DATABASE 'encrypted.db' AS encrypted KEY 'testkey';
sqlite> SELECT sqlcipher_export('encrypted');
sqlite> DETACH DATABASE encrypted;
解密
sqlcipher encrypted.db
sqlite> PRAGMA key = 'testkey';
sqlite> ATTACH DATABASE 'plaintext.db' AS plaintext KEY ''; -- empty key will disable encryption
sqlite> SELECT sqlcipher_export('plaintext');
sqlite> DETACH DATABASE plaintext;
iOS:SQLite.swift的运用
pod 'SQLite.swift/SQLCipher'
注意:pod 'SQLite.swift'
和pod 'SQLite.swift/SQLCipher'
如果同时引用会引起错误,引入 SQLite.swift/SQLCipher
即可。
参考sqlcipher
先外部进行加密后,导入至项目中
import SQLite
let db = try Connection("path/to/encrypted.sqlite3")
try db.key("secret")
try db.rekey("new secret") // 对加密的数据库替换加密KEY
SQLite.swift 也存在sqlcipher_export
let db = try Connection("path/to/unencrypted.sqlite3")
try db.sqlcipher_export(.uri("encrypted.sqlite3"), key: "secret")
-
encrypted.sqlite3
指定一个导出加密数据库的完整路径。