我正在使用Firebird 3,并通过此处找到的AES128插件进行加密。 https://www.ibphoenix.com/products/software/encryptionplugin
我已经成功加密了数据库,并且能够使用isql
连接和查询它,但是我无法从我的 ColdFusion CFIDE - 数据源区域中进行连接。 我以前使用过dbcrypt
插件,它工作正常,与未加密的数据库相比,它非常慢。 但是使用AES128插件,我收到错误
数据源的连接验证失败:devBBL java.sql.SQLException:不支持的操作代码:97 根本原因 是:java.sql.SQLException:不支持的操作代码:97
"CFIDE 数据源"窗口中的连接信息与往常相同。
JDBC URL: jdbc:firebirdsql:localhost/3050:C:fbdbMASTER25.FDB
Driver Class: org.firebirdsql.jdbc.FBDriver
Driver Name: JayBird
Username: SYSDBA
Password: PASSWORD
有没有人知道是什么导致我在尝试连接时收到此错误? 我需要包含一些额外的参数吗?
如果数据库已加密并且插件需要回调才能获取密钥(而不是使用服务器本地加密密钥),则会发生这种情况。
如果配置为使用回调来获取加密密钥,则在连接阶段,Firebird 将向客户端发送一个带有操作代码op_crypt_key_callback
(= 97)(和插件特定数据)的数据包,客户端反过来应该使用加密密钥(或至少使用插件可用于派生加密密钥的插件特定数据)对此做出响应。
3.0.4 之前的 Jaybird 版本不支持处理加密密钥回调(操作代码 97),因此会发生此错误。
Jaybird 3.0.4 中引入了将固定响应传递给加密密钥回调的基本支持。对于早期版本,如果无法升级,解决方法是使用服务器本地加密密钥。
溶液
解决方案是将 Jaybird 升级到 Jaybird 3.0.4,这引入了对数据库加密回调的支持。如果加密插件执行回调,但实际上不需要使用响应的内容,那么它将开箱即用。
如果加密插件需要回复密钥,您可以在dbCryptConfig
连接属性中设置密钥。您可以使用 base64 编码值,方法是在它前面加上base64:
或字符串键,字符串键将使用 UTF-8 编码转换为字节。
例如,在连接字符串中:
jdbc:firebirdsql://localhost/appdbalias?dbCryptConfig=base64:dmVyeXNlY3JldGtleQ==
或
jdbc:firebirdsql://localhost/appdbalias?dbCryptConfig=verysecretkey
该实现目前不支持更高级的回调。
Jaybird 3.0.4(或更高版本)可以从 https://www.firebirdsql.org/en/jdbc-driver/下载
有关详细信息,请参阅 Jaybird 3.0.x 发行说明,数据库加密支持部分。
解决方法
注意仅当您尚无法升级到 Jaybird 3.0.4 或更高版本时,才使用此解决方法。
根据 https://www.ibphoenix.com/products/software/encryptionplugin 上的说明,您可以使用KeyHolderPlugin = KeyFile
而不是KeyHolderPlugin = Callback
来配置服务器本地密钥。
不幸的是,这不起作用。看起来有问题的插件正在无条件地执行对客户端的回调,即使它在本地具有必要的可用数据。这可能是这个加密插件中的一个错误,或者可能是故意的设计决策。
IBPhoenix发布了此插件的新版本,版本1.2.1,它允许您在设置DisableCallback = true
plugins/KeyFile.conf
中使用显式设置来禁用此回调。