我们知道SQLite不对数据加密,如需加密数据,通常采用SQLCipher方案。
SQLCipher在SQLite基础上,基于AES-256算法对数据库文件整体加密,包括数据页和元数据。通过SQLite的hooks功能注入加密逻辑,实现数据写入磁盘前加密、读取时自动解密,开发者无需大幅修改现有SQL逻辑即可增强数据安全性。
本文描述SQLCipher下载、编译、安装、命令行、编码开发等简单操作和基础知识。
1/4) 下载源代码
官方网站:https://www.zetetic.net/sqlcipher
代码网站:https://github.com/sqlcipher/sqlcipher
下载网址:https://github.com/sqlcipher/sqlcipher/releases
演示版本:https://github.com/sqlcipher/sqlcipher/archive/refs/tags/v4.10.0.tar.gz
使用上述链接下载V4.10.0版本后,使用如下命令解压:
1 | tar -zxvf sqlcipher-4.10.0.tar.gz |
代码包解压后如下图所示:

2/4) 编译和安装
第一步,使用如下命令安装依赖库libssl-dev:
1 | sudo apt install libssl-dev |
安装完毕后,我们可以在如下目录看到libcrypto和libssl的动态库和静态库:

第二步,进入SQLCipher解压后的代码目录,使用如下命令配置编译选项:
1 | ./configure --with-tempstore=yes --disable-tcl --prefix="/home/mancode/apps/sqlcipher/4.10.0" \ |
该命令执行完毕之后,如下图所示:

第三步,编译
使用如下命令,进行编译:
1 | make |
该命令执行完毕之后,如下图所示:

第四步,安装
使用如下命令,进行安装:
1 | make install |
该命令执行完毕之后,如下图所示:

执行安装命令后,我们看看目标目录结构:
将 /home/mancode/apps/sqlcipher/4.10.0/bin 加入到系统PATH中,方便调用sqlite3命令。

3/4) 使用sqlite3工具演示SQLCipher的使用方法
第一步,启动命令,创建一个加密数据库
使用如下命令,test.db就是我们欲创建的加密数据库:
1 | sqlite3 test.db |
启动成功如下图:
注意:到此test.db还不是加密数据库,在下一步设置加密密码之后才转为加密数据库。
第二步,设置密钥,加密数据库
使用命令:
1 | PRAGMA key = '123456789'; |
该命令执行如下图所示:

第三步,创建表和插入数据
使用命令:
1 | create table msg(id interger PRIMARY KEY, name text NOT NULL, age interger, school text); |
该命令执行如下图所示:

第四步,验证:在不输入密码的情况下读取数据
按照预期,在不输入密码的情况下打开数据库,读取数据肯定要报错,我们使用如下方法验证:

从上图可见,如我们的预期一样,在没有输入数据库密码时,获取相关元数据时,报Error: file is not a database的错误。
然后我们再按上述方法输入数据库密码,看下数据库的表现:

从上图可见,如我们的预期一样,在输入数据库密码后,可以正常读取元数据以及用户数据。
4/4) 使用SQLCipher库编码开发
如下测试代码,完成打开数据库、设置密钥、创建数据表、插入数据、检索数据等基本操作。
1 |
|
然后使用如下简单的Makefile进行编译:
1 | SQLCIPHER_DIR:=/home/mancode/apps/sqlcipher/4.10.0 |
注意:编译参数务必加上 -DSQLITE_HAS_CODEC,否则会报如下错误:
1 | error: ‘sqlite3_key’ was not declared in this scope |

编译成功之后,我们使用第三章创建的test.db进行测试,结果如下图所示:

至此,我们演示了SQLCipher的下载、编译、安装、命令行、编码开发等基本操作,整体来看开发人员很容易从SQLite迁移到SQLCipher。
使用该SDK的测试代码和工程文件,可参考:https://github.com/wosanxian/sqlcipher-example/tree/main/example/linux