SQLCipher基于SQLite,大多数API与SQLite 3的C / C ++接口相同。
以PRAGMA,SQL函数和C函数的形式添加了许多安全性的扩展.
扩展
动态加密
设置密钥,对原有数据库加密,解密.
sqlite3_key / sqlite3_key_v2 -> PRAGMA key
更新密钥,更改加密密钥.
sqlite3_rekey/ sqlite3_rekey_v2 -> PRAGMA REKEY
//对未加密数据库进行加密
.\sqlcipher.exe ./origin.db
sqlite> ATTACH DATABASE 'encrypt.db' AS encrypt KEY '123';//create and open Connection as encrypt KEY
sqlite> SELECT sqlcipher_export ('encrypt'); copy to encrypt
sqlite> DETACH DATABASE encrypt;
//对加密数据库进行解密
.\sqlcipher.exe ./encrypt.db
sqlite> PRAGMA KEY='123';
sqlite> ATTACH DATABASE 'decrypt.db' AS decrypt KEY '123';//create and open Connection as decrypt KEY
sqlite> SELECT sqlcipher_export ('decrypt');
sqlite> DETACH DATABASE decrypt;
// 对加密数据库修改密码
.\sqlcipher.exe ./encrypt.db
sqlite> PRAGMA KEY='123'; //先输入旧密码
sqlite> PRAGMA REKEY='abc'; //新密码`
篡改检测
添加加密配置HMAC
(Keyed-Hashing for Message Authentication) 基于Hash函数和密钥key一起进行认证的算法
SQLCipher 2.0引入了每页HMAC,以验证页面数据没有被篡改(基于密钥的报文完整性的验证方法)
但由于兼容性的问题,也提供了禁用检查的方法.
强密钥派生
用伪随机函数从密钥或密码的值中派生出一个或多个密钥
特征
性能
快速的性能,许多操作的加密开销仅为5-15%
安全
- CBC模式,将明文切分成若干小段,使每一小段与初始块或者上一段的密文段进行异或运算后,再与密钥进行加密。
- HMAC(Keyed-Hashing for Message Authentication)
- 密钥派生
使用便捷
- 零配置和应用级加密
- 加密可配置
兼容性
- SQLCipher保持数据库格式在同一主版本号内的兼容性(因此只要平台间的主版本相同,任何平台上的应用程序都可以打开由任何其他应用程序创建的数据库)
- 较新的主要版本一般不会打开较早版本创建的数据库.
- 关于SQLCipher的升级提供了配置策略:升级文档
SQLCipher在WCDB上的使用
WCDB使用SQLCipher
/**
* Create a new object as a copy of an existed one.
* @param rhs The object to be copied
*/
public SQLiteCipherSpec(SQLiteCipherSpec rhs) {
kdfIteration = rhs.kdfIteration; 提供设置密钥导出函数的迭代次数,迭代次数越多,破解越困难
hmacEnabled = rhs.hmacEnabled; // 提供是否禁用"hmac算法检查"的设置
pageSize = rhs.pageSize; //对于处理大量页面的查询,通过增加页面大小提高性能.
}
提供属性设置方法以及 setSQLCipherVersion(int version)
为兼容旧版本 提供设置 kdfAlgorithm 设置要使用的KDF算法
hmacAlgorithm HMAC和密钥派生的HMAC算法。
对C方法的封装
数据库通过数据库连接池打开,查看源码
SQLiteDatabase ->openOrCreateDatabase
->openDatabase
->open->openInner
->SQLiteConnectionPool.open
1. 构建数据库连接,必传参数SQLiteCipherSpec
2. 数据库修复
参考文档:
sqlcipher-api
WCDB源码