两种思路

将内容加密后再写入数据库

这种方式使用简单,在入库/出库只需要将字段做对应的加解密操作即可,一定程度上解决了将数据赤裸裸暴露的问题。但也有很大弊端:

  • 这种方式并不是彻底的加密,还是可以通过数据库查看到表结构等信息。
  • 对于数据库的数据,数据都是分散的,要对所有数据都进行加解密操作会严重影响性能。

对数据库文件加密

SQLCipher(Cipher, [ˈsaɪfə(r)],加密算法的意思)。SQLCipher是一个在SQLite基础之上进行扩展的开源数据库,它主要是在SQLite的基础之上增加了数据加密功能,如果我们在项目中使用它来存储数据的话,就可以大大提高程序的安全性。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个字节)。