使用SQLite数据库加密敏感信息并嵌入程序(1)

一、前言

SQLite 是目前运行最广泛的数据库引擎,没有之一,它的主要目标是嵌入式应用,它是D. Richard Hipp(理查德·希普)博士建立的公有领域项目,所有实现包含在一个C语言文件中。它有着广泛的兼容性、低依赖性、稳定性,能和众多开发语言相结合,支持主流的 Windows / Linux / Unix 操作系统,占用极少的资源。在构建的适用于不同程序开发语言版的程序中性能强劲,几乎所有大型程序都内嵌一个 SQLite 引擎以解决自身的关系型数据管理,这些程序广泛运行在不同的平台。

选择它的理由正如官网所言:

Samll.Fast.Reliable. Choose any three.

二、开发环境及工具

本文所示代码环境:Windows10 x64专业版(19042.746)+ Embarcadero RAD Studio 10.4。

本文所使用到的工具:SQLiteDatabaseBrowserPortable v3.7.0。

三、使用 SQLiteDatabaseBrowserPortable 创建数据库图解

由于SQLite官方只是实现了数据库引擎,无相关管理工具,因此存在众多非官方的图形管理工具,在众多工具中本文选择 SQLiteDatabaseBrowserPortable 来数据库管理,并使用该工具来进行数据库的创建,所有操作均可方便由它来进行图形化操作。

具体创建过程与步骤见 图1 — 图5 所示。

图 1  SQLiteDatabaseBrowserPortable 版本
图 2  新建数据库表
图 3  添加一条记录
图 4   数据显示方式切换
图 5   提交记录写入数据

四、使用原生 SQLite 数据库引擎创建数据库

使用 SQLiteDatabaseBrowserPortable 创建的数据库,无法设置密码,下面我们来使用代码调用原生 SQLite 数据库引擎操作数据库。

1、BNSQLiteFuns.pas 单元

由于 SQLite 源码非常庞大,在常规操作中很多函数一般用不到,网上有很多移植到 Delphi 的版本源码,也比较庞大,实属无必要,本文只选择使用到的部分,比如定义了一个 SQLite 函数结构,用以获取到 SQLite 引擎模块后填充该结构以方便后续操作,部分代码如下 图6— 图7所示:

图 6  TBNSQLiteFunPtr 结构定义(部分)
图 7  TBNSQLiteFunPtr 结构定义(部分)

2、BNSQLiteUtils.pas 单元

接下来定义二个类,一个是简单封装获取 SQLite 原生函数的操作类 TBNSQLiteUtils ,主要功能是加载指定路径的SQLite.dll文件,并获取各函数地址填充TBNSQLiteFunPtr 的结构,类定义如图8所示:

图 8  TBNSQLiteUtils 类定义

另一个是演示数据操作类 TBNSQLiteHelpers ,定义如图9所示:

图 9  TBNSQLiteHelpers 类定义标题

为简单演示,该类运行后可通过选择控制台上的菜单项进行相应操作,如图10所示:

图 10  使用 SQLie 原生函数操作数据库

使用演示数据操作类 TBNSQLiteHelpers 创建的演示数据库已设置数据库密码,前提是所使用的 SQLite 数据库模块已实现 sqlite3_key 及 sqlite3_rekey 方法。由于 SQLiteDatabaseBrowserPortable 不支持加密的 SQLite 数据库,所以无法打开此次生成的演示数据库。

五、结语

作为演示,在设置 blob 字段数据时数据本身并没有加密处理,在实际开发中往往进行多次加密,以便保存敏感信息,然后将数据库作为资源嵌入到程序中并在运行时在内存中动态解密数据库获取相关信息,下篇我们将在此基础上实现这个方案。

经验分享 程序员 微信小程序 职场和发展