【问题标题】:Encrypted jdbc connection to db2 on mainframe加密 jdbc 连接到大型机上的 db2
【发布时间】:2017-07-10 10:23:10
【问题描述】:

我正在通过 JDBC 连接到在大型机上运行的 DB2 服务器。 我有建立加密连接的要求!我需要通过网络实现加密连接或数据加密。 你能帮我实现同样的目标吗!

如链接here所示,我已经与运行在linux上的Oracle服务器建立了加密连接

【问题讨论】:

    标签: java encryption jdbc db2 mainframe


    【解决方案1】:

    在 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。

    【讨论】:

      【解决方案2】:

      除了 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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          第 1 步:通过 JDBC 与 DB2 建立非加密连接。让它工作并彻底测试它。

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

          第三步:将两者合并,实现全连接:

          JDBC -> Encryption -> Transfer -> Decryption -> DB2
          

          分阶段进行可以帮助您隔离任何问题。在第 2 步中,您需要避免使用系统默认值来加密或解密,明确指定双方的所有内容。如果事情不完全匹配,一个字节一个字节,那么加密就会失败。还要注意诸如字符编码和字节顺序之类的挑剔的东西。例如,您的大型机使用 EBCDIC、ASCII/ANSI 还是 Unicode? PC 世界中的常见假设并不总是适用于大型机。

          【讨论】:

          • 我不认为“自己动手”在与已经提供各种开箱即用加密方法的复杂服务器系统通信时特别有用。而且我不认为这可能会起作用-您将如何加密 jdbc-login?在数据库之前构建某种代理服务器?
          • “自己动手”在哪里?我假设两个系统上都可以使用兼容的加密软件,同样,两个系统上都可以使用兼容的互通软件。如果内置加密通信已经可用,那么为什么要问这个问题?
          • “为什么要问这个问题” - 因为 OP 不知道如何激活加密?对于任何有用的答案,您也许应该详细说明第 3 项:我们正在讨论用加密层包装基于 TCP 的通信协议,而不是一些文件传输。你将如何在客户端拦截通信,在服务器端如何拦截?
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-06-24
          • 1970-01-01
          • 2015-12-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多