使用AES128插件的Firebird 3.0加密 - 无法连接

时间:2018-04-13 12:55:58

标签: jdbc firebird jaybird firebird-3.0

我通过此处的AES128插件使用Firebird 3进行加密。 https://www.ibphoenix.com/products/software/encryptionplugin

我已经成功加密了数据库,我可以使用v1b <- gsub("X","%s",v1,fixed=T) do.call(sprintf,c(list(v1b),v2)) # [1] "Lily is the girlfriend of John." "Lily is the teacher of John." 进行连接和查询,但是我无法从我的ColdFusion CFIDE - 数据源区域进行连接。我之前使用的是isql插件,它运行正常,与未加密的数据库相比,速度非常慢。但是使用AES128插件,我收到了错误

  

数据源的连接验证失败:devBBL   java.sql.SQLException:不支持的操作代码:97根本原因   是这样的:java.sql.SQLException:不支持的操作代码:97

我在CFIDE数据源窗口中的连接信息与它一直相同。

dbcrypt

有没有人知道在尝试连接时是什么原因导致我收到此错误?我是否需要包含一些额外的参数?

1 个答案:

答案 0 :(得分:2)

如果数据库已加密并且插件需要回调来获取密钥(而不是使用服务器本地加密密钥),则会发生这种情况。

如果配置为使用回调来获取加密密钥,则在附加阶段,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发行说明的第Database encryption support部分。

解决方法

注意如果您尚未升级到Jaybird 3.0.4或更高版本,请仅使用此解决方法。

根据https://www.ibphoenix.com/products/software/encryptionplugin上的说明,您可以使用KeyHolderPlugin = KeyFile代替KeyHolderPlugin = Callback来配置服务器本地密钥。

不幸的是,这不起作用。看起来有问题的插件无条件地对客户端执行回调,即使它具有本地可用的必要数据。这可能是此加密插件中的错误,也可能是故意的设计决定。

IBPhoenix发布了此版本1.2.1的新版本,允许您使用设置为plugins/KeyFile.conf的{​​{1}}中的明确设置禁用此回调。