Java 大型机上到db2的加密jdbc连接

Java 大型机上到db2的加密jdbc连接,java,encryption,jdbc,db2,mainframe,Java,Encryption,Jdbc,Db2,Mainframe,我通过JDBC连接到大型机上运行的DB2服务器。 我需要建立一个加密连接!我需要通过网络实现加密连接或数据加密。 你能帮我怎样才能达到同样的效果吗 我已经与运行在linux上的Oracle server建立了加密连接,如链接所示。步骤1:通过JDBC与DB2建立非加密连接。让它工作并彻底测试它 第2步:将加密的简单数据传输到大型机,即使只是传递诸如“Hello World!”之类的文本消息,也要让它工作并彻底测试它 第3步:将两者合并以实现完全连接: JDBC -> Encryption

我通过JDBC连接到大型机上运行的DB2服务器。 我需要建立一个加密连接!我需要通过网络实现加密连接或数据加密。 你能帮我怎样才能达到同样的效果吗


我已经与运行在linux上的Oracle server建立了加密连接,如链接所示。步骤1:通过JDBC与DB2建立非加密连接。让它工作并彻底测试它

第2步:将加密的简单数据传输到大型机,即使只是传递诸如“Hello World!”之类的文本消息,也要让它工作并彻底测试它

第3步:将两者合并以实现完全连接:

JDBC -> Encryption -> Transfer -> Decryption -> DB2
分阶段进行有助于隔离任何问题。在第2步中,您需要避免使用系统默认值进行加密或解密,明确指定两侧的所有内容。如果事情不完全匹配,一个字节接一个字节,那么加密就注定要失败。此外,还要注意一些吹毛求疵的事情,如字符编码和字节顺序。例如,您的大型机是否使用EBCDIC、ASCII/ANSI或Unicode?PC世界中的常见假设并不总是适用于大型机。

使用DB2JDBC驱动程序中的(加密的用户密码和数据安全性)。例如,使用db2simpledasource:

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
import com.ibm.db2.jcc.db2simpledasource;
...
db2simpledasource ds=新的db2simpledasource();
ds.setDriverType(4);
ds.setDatabaseName(“”);
ds.setServerName(“”);
ds.setPortNumber();
ds.setUser(“”);
设置密码(“”);
//将安全机制设置为用户ID和加密密码
ds.setSecurityMechanism(DB2BaseDataSource.ENCRYPTED_USER_PASSWORD_和_DATA_SECURITY);
ds.setEncryptionAlgorithm(2);//请求AES加密

为此,您需要使用JCE的无限制策略文件修补JVM。

除了Ebbe的答案之外,您还可以使用SSL/TLS进行jdbc连接,尽管这需要在服务器端做一些工作。特别是在您的系统中,人们必须为大型机的TCP堆栈设置AT-TLS,如果尚未为某些应用程序实现,这将是一项艰巨的工作。然后,您必须为DB2的jdbc端口定义一个使用SSL/TLS的策略

最后,在客户端,您只需在jdbc连接上设置一个属性即可启用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);

详细说明见。

除了已经发布的答案外,还有一个非常简单的解决方案我很少提到——将您的连接从IPv4切换到IPv6。在它的许多其他属性中,IPv6在任何会话上都包含内置加密,因此只需将您的网络地址从IPv4地址更改为IPv6地址就可以了。在大型机上可以进行一些网络和系统配置,但是一旦设置完成,您就可以保证所有JDBC网络连接都默认加密

我认为,当与一个已经提供各种现成加密方法的复杂服务器系统通信时,“自己滚”并不是特别有用。我不认为这可能有效-您将如何加密jdbc登录?在数据库之前建立某种代理服务器?什么是“你自己的”呢?我假设两个系统上都有兼容的加密软件,同样,两个系统上都有兼容的内部通信软件。如果内置加密通信已经可用,那么为什么会问这个问题?“为什么会问这个问题”-因为OP不知道如何激活加密?对于任何有用的答案,您也许应该详细说明第3项:我们谈论的是用加密层包装基于TCP的通信协议,而不是一些文件传输。如何在客户端截获通信,如何在服务器端截获通信?