【问题标题】:Python IBM_DB package using encryptionAlgorithm and securityMechanism parametersPython IBM_DB 包使用encryptionAlgorithm 和securityMechanism 参数
【发布时间】:2021-03-31 21:58:17
【问题描述】:

在连接到 DB2 数据库时,我需要使用 encryptionAlgorithm 和 securityMechnism 参数。我没有遇到任何有关如何将其包含在 ibm_db 的连接字符串中的信息。这是我当前连接字符串的样子:

import ibm_db_dbi 

connect = ibm_db_dbi.connect("DATABASE=; \
    HOSTNAME=; \
    PORT=; \
    PROTOCOL=; \
    UID=; \
    PWD=; \
    CURRENTSCHEMA=;", "", "")

我可以像这样实现与数据库的连接。但我不知道在哪里包含这些参数。在打开的一个 git hub 问题中,IBM_DB 的一位代表说:

我们在后台使用 ODBC 和 CLI 驱动程序,因此 AUTHENTICATION 是您感兴趣的属性。您可以在 db2cli.ini 文件或 db2dsdriver.cfg 文件中设置此属性,或作为连接字符串属性设置为 ibm_db.connect( ) API。 https://github.com/ibmdb/python-ibmdb/issues/279

但是,没有指定如何在连接字符串中包含 AUTHENTICATION 参数。就这样贴上去,还是直接把securityMechanism和encryptionAlgorithm作为自己的参数直接放到连接字符串里面?

AUTHENTICATION={securityMechanism:9;encryptionAlgorithm:2}

另一个人说完全可以使用 encrptionAlgorithm 和 securityMechanism 参数作为连接字符串的一部分,但没有说明如何:

对于在 Linux/Unix/Windows 上运行的 Db2 服务器,带有 clidriver(或 IBM 提供的其他等效项)的 python ibm_db 模块支持连接字符串,其 AUTHENTICATION 参数与 Db2 实例上该参数的值匹配 connect db2 using python with securityMechanism=13

在确定将这些值(encryptionAlgorithm=2 和 securityMechanism=9)放置在 IBM_DB 的连接字符串中的位置时,我将不胜感激。

【问题讨论】:

    标签: python database db2 connection


    【解决方案1】:

    securityMechanismEncryptionAlgorithm 这两个属性仅适用于 JDBC/SQLJ 应用程序。不要将 JDBC/SQLJ 应用程序与 CLI 应用程序混淆。

    Python ibm_db 模块不使用 jdbc 或 java,它是用“C”语言编写的,并通过 CLI(调用级接口)连接到数据库。因此,Db2 将您的 python 脚本视为 CLI 应用程序。 Python ibm_db 应用程序不是 JDBC/SQLJ 应用程序。

    CLI 应用程序的连接属性(也称为关键字)可能与 JDBC/SQLJ 应用程序的连接属性不同,但许多属性相同或具有不同的名称或值。

    CLI 应用程序可以通过连接字符串属性或db2dsdriver.cfg 指定AUTHENTICATION 机制(或仅通过db2cli.ini 用于MS-Windows)。在所有情况下,这都显示为 authentication=xxxx,其中 xxx 是身份验证的值,它必须与托管您要连接的数据库的 Db2 服务器的值匹配。在连接字符串中,属性需要一个前导和尾随分号(但第一个属性没有前导分号)。

    当连接到 Db2-LUW 服务器时,当前支持的 IBM CLI 驱动程序将自动决定(默认情况下)加密是一种被认为是最安全的加密方式,并由 CLI 驱动程序和 Db2 服务器实现。这就是您在不指定这些属性的情况下连接成功的原因。

    对于 CLI 应用程序,您还可以使用关键字/属性 ClientEncAlg=2(意思是 AES)另外指定 algorithm,但如果您省略此选项,驱动程序仍然可以选择它,前提是连接双方以相同的密钥长度实现算法.

    有关所有可能的连接关键字/参数的完整列表,请参阅您的 Db2 平台和您的 Db2 服务器版本的 Db2 在线知识中心。关键字可以是特定于版本和特定于 Db2-server-platform 的,除了依赖于配置。对于 Db2-LUW,请参阅 here

    对于自动客户端重新路由,请检查 AltHostName 关键字,它也可以是连接字符串的一部分。但是,对于 ACR,只要正确维护 CLI 驱动程序并使用修订包保持“最新”,那么正确配置 Db2-server 实例将允许服务器将备用主机/端口详细信息返回到客户端上的 CLI 驱动程序。可能还需要为无缝故障转移设置相关参数/关键字,请参阅docs

    所以在你的代码中,你可以试试:

    connect = ibm_db_dbi.connect("DATABASE=whatever; \
        HOSTNAME=whatever; \
        PORT=whatever; \
        PROTOCOL=TCPIP; \
        UID=whatever; \
        PWD=whatever; \
        CURRENTSCHEMA=whatever;\
        AUTHENTICATION=SERVER_ENCRYPT;\
        ClientEncAlg=2;", "", "")
    

    您也可以尝试 AUTHENTICATION=SERVER_ENCRYPT_AES ,它取决于目标 Db2 服务器平台(Z/OS、i 系列、Linux/Unix/Windows)和配置。您的问题没有具体说明这些事实。

    但请注意!如果您的 Db2 服务器配置未正确配置,则连接将失败。这就是省略这些细节并让 CLI 驱动程序找出可能的原因的原因。

    许多站点更喜欢从 python 脚本源代码中省略此类配置,而是将配置详细信息存储在外部(在 db2dsdriver.cfg 中),并在代码中简单地引用 DSN 或将该名称也放在外部,但这是另一回事.外部配置意味着连接字符串不会在平台、环境和版本之间改变,但最重要的是它允许任何 CLI 或 ODBC 应用程序受益,不仅是 python ibm_db,并且让配置是可测试的/无需使用 python 即可验证。

    【讨论】:

    • 非常感谢您提供非常详细的答案。 Db2 服务器位于 Linux 上。我们的 Db2 服务器端配置具有与上述相同的参数(新属性为 2 和 9)。我们用于基于 JDBC 的应用程序的另一个关键字是 clientRerouteAlternateServerName 和 clientRerouteAlternatePortNumber。你知道这些是否也与 CLI 应用程序/它们的 CLI 等效项兼容,我是否可以将它们放在连接字符串中? ibm.com/support/knowledgecenter/SSEQTP_liberty/…
    • ibm.com/support/producthub/db2/docs/content/SSEPGG_11.5.0/… 在此示例中,它显示您可以使用 enableAlternateServerListFirstConnect 编辑 cfg 文件,并指定端口和主机名。但这是否可以在如上所示的连接字符串中完成?
    • 我已将这些问题移至新帖子:stackoverflow.com/questions/66907707/…
    猜你喜欢
    • 1970-01-01
    • 2016-04-26
    • 1970-01-01
    • 2019-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多