我通过此处的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
有没有人知道在尝试连接时是什么原因导致我收到此错误?我是否需要包含一些额外的参数?
答案 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}}中的明确设置禁用此回调。