🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] ## 两种思路 ### 将内容加密后再写入数据库 这种方式使用简单,在入库/出库只需要将字段做对应的加解密操作即可,一定程度上解决了将数据赤裸裸暴露的问题。但也有很大弊端: 1. 这种方式并不是彻底的加密,还是可以通过数据库查看到表结构等信息。 2. 对于数据库的数据,数据都是分散的,要对所有数据都进行加解密操作会严重影响性能。 ### 对数据库文件加密 SQLCipher ## SQLCipher 使用256-bit AES加密,其原理和SQLiteEncrypt一样,都是实现了SQLite的加密相关接口 > \- 快速只有5 - 15%的性能开销加密 > \- 100%的数据库中的数据文件是加密的 > \- 使用良好的安全模式(CBC模式,密钥推导) > \- 零配置和应用程序级加密 > \- OpenSSL加密库提供算法 ### 加密解密过程 SQLite数据库设计中考虑了安全问题并预留了加密相关的接口。但是并没有给出实现。SQLite 数据库源码中通过使用SQLITE\_HAS\_CODEC宏来控制是否使用数据库加密。并且预留了四个结构让用户自己实现以达到对数据库进行加密的效果。这四个接口分别是: * sqlite3\_key(): 指定数据库使用的密钥 * sqlite3\_rekey():为数据库重新设定密钥; * sqlite3CodecGetKey():返回数据库的当前密钥 * sqlite3CodecAttach(): 将密钥及页面编码函数与数据库进行关联。 而sqlcipher就是实现这四个接口以及自己的一些接口 解密的操作是以page为单位进行的(每一个page就是db文件的每1024个字节)。