【发布时间】:2017-07-10 10:23:10
【问题描述】:
我正在通过 JDBC 连接到在大型机上运行的 DB2 服务器。 我有建立加密连接的要求!我需要通过网络实现加密连接或数据加密。 你能帮我实现同样的目标吗!
如链接here所示,我已经与运行在linux上的Oracle服务器建立了加密连接
【问题讨论】:
标签: java encryption jdbc db2 mainframe
我正在通过 JDBC 连接到在大型机上运行的 DB2 服务器。 我有建立加密连接的要求!我需要通过网络实现加密连接或数据加密。 你能帮我实现同样的目标吗!
如链接here所示,我已经与运行在linux上的Oracle服务器建立了加密连接
【问题讨论】:
标签: java encryption jdbc db2 mainframe
在 db2 jdbc 驱动程序中使用 securityMechanism 13 (ENCRYPTED_USER_PASSWORD_AND_DATA_SECURITY)。例如。使用 DB2SimpleDataSource:
import com.ibm.db2.jcc.DB2SimpleDataSource;
...
DB2SimpleDataSource ds = new DB2SimpleDataSource();
ds.setDriverType(4);
ds.setDatabaseName("<db name>");
ds.setServerName("<server name>");
ds.setPortNumber(<port>);
ds.setUser("<user>");
ds.setPassword("<password>");
// Set security mechanism to User ID and encrypted password
ds.setSecurityMechanism(DB2BaseDataSource.ENCRYPTED_USER_PASSWORD_AND_DATA_SECURITY);
ds.setEncryptionAlgorithm(2); // Request AES encryption
为此,您需要使用 JCE 的无限制策略文件修补您的 JVM。
【讨论】:
除了 Ebbe 的回答之外,您还可以将 SSL/TLS 用于您的 jdbc 连接——尽管这需要在服务器端进行一些工作。特别是您的系统人员必须为您的大型机的 TCP 堆栈设置 AT-TLS,如果尚未为某些应用程序实现它,这是一项工作。然后您必须为 DB2 的 jdbc-port 定义一个使用 SSL/TLS 的策略。
最后,在客户端,您只需在 jdbc-connection 上设置一个属性即可启用 TLS:
java.util.Properties props = new java.util.Properties();
props.put( "user", user );
props.put( "password", pass );
props.put( "sslConnection", "true" );
java.sql.Connection con = java.sql.DriverManager.getConnection(url, props);
详细说明见this redpaper。
【讨论】:
除了已经发布的答案之外,还有一个我很少提到的非常简单的解决方案 - 将您的连接从 IPv4 切换到 IPv6。在它的许多其他属性中,IPv6 包括对任何会话的内置加密,因此只需将您的网络地址从 IPv4 地址更改为 IPv6 地址可能就足够了。为此需要在大型机上进行一些网络和系统配置,但是一旦设置好,您就可以保证所有 JDBC 网络连接在默认情况下都是加密的。
【讨论】:
第 1 步:通过 JDBC 与 DB2 建立非加密连接。让它工作并彻底测试它。
第 2 步:将加密的简单数据传输到工作的大型机,即使它只是传递诸如“Hello World!”之类的文本消息。让它工作并彻底测试它。
第三步:将两者合并,实现全连接:
JDBC -> Encryption -> Transfer -> Decryption -> DB2
分阶段进行可以帮助您隔离任何问题。在第 2 步中,您需要避免使用系统默认值来加密或解密,明确指定双方的所有内容。如果事情不完全匹配,一个字节一个字节,那么加密就会失败。还要注意诸如字符编码和字节顺序之类的挑剔的东西。例如,您的大型机使用 EBCDIC、ASCII/ANSI 还是 Unicode? PC 世界中的常见假设并不总是适用于大型机。
【讨论】: