Firebird 加密演示
如何使用IBSurgeon插件加密Firebird数据库:在服务器上安装、从应用程序连接、使用开发工具以及运行加密备份/恢复。完整产品:Encryption Framework。
一步安装脚本
Windows:从GitHub运行安装程序 - English · Português。
Linux:使用来自IBSurgeon/firebirdlinuxinstall的标准Firebird安装程序,并带-crypt-only参数。
手动安装的前提条件
- Firebird 3.0.3或更高版本(3.x、4.x、5.x)。此演示不支持更旧的版本。
- 试用插件压缩包以及Delphi/Lazarus/.NET/PHP示例(见下文)。
- 将试用版DbCrypt.conf放入
plugins文件夹。 - 一个SYSDBA用户。如果缺失:停止Firebird,运行
isql -user sysdba employee.fdb,执行CREATE USER SYSDBA PASSWORD 'masterkey';,然后启动服务。
本教程使用64位Firebird。对于32位,请从对应的WINDOWS_32bit(或Linux 32位)压缩包中获取文件。
下载
ExampleApplications.zip - 已编译的演示客户端和源代码。DbCrypt.conf - 试用密钥。
步骤1 - 初始加密(Windows示例)
将未加密的数据库放在方便的位置,例如C:\Temp\EMPLOYEE30\EMPLOYEE30.FDB。
1. 在databases.conf中设置别名
crypt = C:\Temp\EMPLOYEE30\EMPLOYEE30.FDB
{
KeyHolderPlugin = KeyHolder
}
要将密钥持有者应用于每个数据库,请在firebird.conf中添加KeyHolderPlugin = KeyHolder,或从压缩包中复制示例firebird.conf(步骤3)。
2. 将文件放入server/plugins
来自FB_NN_WINDOWS_64bit\Server\plugins:
DbCrypt.dllDbCrypt.conf(试用密钥)KeyHolder.dllKeyHolder.conf- 包含密钥的文本文件,仅用于开发。请勿将其分发给最终用户。
3. 将文件放入Firebird根目录
来自FB_NN_WINDOWS_64bit\Server:fbcrypt.dll、libcrypto-1_1-x64.dll、libssl-1_1-x64.dll、gbak.exe、firebird.msg,以及可选的firebird.conf。
4. 使用isql加密
isql localhost:C:\Temp\EMPLOYEE30\EMPLOYEE30.FDB -user SYSDBA -pass masterkey
SQL> alter database encrypt with dbcrypt key red;
SQL> show database;
show database;(或gstat -h)应显示Database encrypted。
dbcrypt是插件名称;red是在KeyHolder.conf中定义的密钥。在Linux上,请使用引号并注意大小写匹配:
alter database encrypt with "DbCrypt" key Red;
完成此步骤后,服务器将密钥保存在KeyHolder.conf中(开发/管理员模式)。
服务器与客户端各自包含的内容
| 服务器 | 客户端 |
|---|---|
plugins/dbcrypt.dll、plugins/keyholder.dll、DbCrypt.conflibssl-1_1-x64.dll、libcrypto-1_1-x64.dll、fbcrypt.dll加密版 gbak:gbak.exe、firebird.msg可选: plugins/KeyHolder.conf(开发密钥)、firebird.conf
|
fbclient.dll、fbcrypt.dll、libcrypto-1_1.dll可选: firebird.conf
|
步骤2 - 从客户端应用程序连接
为了模拟客户环境,请重命名或删除plugins/KeyHolder.conf。插件随后将期望从应用程序获取密钥。ExampleApplications.zip包含已编译的Delphi XE8客户端以及Lazarus、.NET和PHP示例。
在常规连接之前,应用程序会发送密钥(多几次额外调用)。之后,Firebird 的使用方式不变。Delphi 演示位于 Example_Delphi_EnhancedCryptTestClient\Win32\Debug 下:
- 在“1. Setup Login”下设置数据库路径或别名。
- 输入密钥名称和值(对于密钥 RED,从
KeyHolder.conf复制值)。 - 您可以使用该密钥进行加密/解密 - 加密需要活动连接,并且需要时间。
- 单击 Execute query 通过加密连接运行一个简单的 SELECT 查询。
该演示仅通过 TCP/IP 连接 - 不支持 XNET。示例明确展示了连接、事务和查询步骤,以便您可以复制该模式。
步骤 3 - 开发者工具和命令行
从 Encryption Framework v2021 开始,fbclient.dll 可以自行加载密钥。IBExpert、FlameRobin、SQLLY、Database Workbench、RedExpert、gfix、nbackup 及类似工具无需修改代码即可正常工作。
匹配客户端位数:
- Firebird 命令行工具(
isql、gfix、nbackup)与服务器匹配 - 将Windows_64bit\WindowsClientPart_64bit复制到这些二进制文件旁边。 - 大多数 GUI 工具是 32 位的 - 将
Windows_32bit\WindowsClientPart_32bit复制到工具的文件夹中。
命令行工具随后使用该 fbclient 副本旁边的 plugins\KeyHolder.conf。其他应用程序仍然自行传递密钥。
- 工具启动并加载
fbclient.dll。 fbclient读取firebird.conf,看到KeyHolderPlugin=KeyHolder,并加载plugins\keyholder.dll。- KeyHolder 读取
KeyHolder.conf(例如密钥 Red)。 isql连接并可以执行SHOW DATABASE。
gbak:客户端密钥加载会生成一个未加密的 .fbk。请使用框架的 gbak 并显式指定 -KEYFILE / -KEYNAME / -KEY,以便备份保持加密状态。
nbackup:增量副本保持加密状态。
步骤 4 - 备份和恢复
标准 gbak 无法打开生产环境的加密数据库(服务器上没有密钥,客户端也没有密钥)。框架附带了一个 gbak,它使用与数据库相同的密钥加密备份。gbak -? 会添加:
-KEYFILE 包含数据库和备份加密密钥的文件名
-KEYNAME 用于加密的密钥名称
-KEY 以 "0x5A," 表示法表示的密钥值
备份
提供密钥,以便 gbak 可以读取数据库并加密 .fbk - 可以是密钥文件(布局与 KeyHolder.conf 相同)或显式值。使用这些开关备份未加密的数据库仍会生成加密的备份。
gbak.exe -b -KEYFILE h:\Firebird\examplekeyfile.txt -KEYNAME RED localhost:h:\employee_30.fdb h:\testenc4.fbk -user SYSDBA -pass masterkey
gbak -b -KEY 0xec,0xa1,0x52,0xf6,0x4d,0x27,0xda,0x93,0x53,0xe5,0x48,0x86,0xb9,0x7d,0xe2,0x8f,0x3b,0xfa,0xb7,0x91,0x22,0x5b,0x59,0x15,0x82,0x35,0xf5,0x30,0x1f,0x04,0xdc,0x75, -keyname RED localhost:h:\employee30\employee30.fdb h:\testenc303.fbk -user SYSDBA -pass masterkey
使用 -KEY 时,您仍然必须传递 -KEYNAME。
恢复
同样的思路:密钥文件或显式密钥。使用这些开关恢复未加密的备份会创建加密的数据库。
gbak -c -v -keyfile h:\Firebird\examplekeyfile.txt -keyname white h:\testenc4.fbk localhost:h:\employeeenc4.fdb -user SYSDBA -pass masterkey
gbak -c -v -key 0xec,0xa1,0x52,0xf6,0x4d,0x27,0xda,0x93,0x53,0xe5,0x48,0x86,0xb9,0x7d,0xe2,0x8f,0x3b,0xfa,0xb7,0x91,0x22,0x5b,0x59,0x15,0x82,0x35,0xf5,0x30,0x1f,0x04,0xdc,0x75, -keyname RED h:\testenc4.fbk localhost:h:\employeeenc4.fdb -user SYSDBA -pass masterkey