Python IBM_DB 使用 encryptionAlgorithm 和 securityMechanism 参数的程序包

Python IBM_DB package using encryptionAlgorithm and securityMechanism parameters

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

import ibm_db_dbi 

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

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

We use ODBC and CLI Driver under the cover and hence AUTHENTICATION is the property you would be interested in. You could set this property in db2cli.ini file or db2dsdriver.cfg file or as a connection string attribute to ibm_db.connect() API. https://github.com/ibmdb/python-ibmdb/issues/279

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

AUTHENTICATION={securityMechanism:9;encryptionAlgorithm:2}

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

For Db2 servers that run on Linux/Unix/Windows , the python ibm_db module with clidriver (or other IBM supplied equivalent), supports connection-strings that have the AUTHENTICATION parameter matching the value of that parameter on the Db2-instance connect db2 using python with securityMechanism=13

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

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

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

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

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

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

对于 CLI 应用程序,您可以另外指定 algorithm 和 keyword/attribute ClientEncAlg=2(意思是 AES),但如果您省略此选项,驱动程序仍然可以选择它,如果连接的双方以相同的密钥长度实现算法。

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

对于自动客户端重新路由,请检查 AltHostName 关键字,它也可以是连接字符串的一部分。但是,对于 ACR,正确配置 Db2-server 实例将允许服务器 return 向客户端上的 CLI 驱动程序替代 host/port 详细信息,只要正确维护和保存 CLI 驱动程序 'current' 与修复包。相关parameters/keywords可能还需要设置无缝故障转移,参考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 或也使用该名称外部,但这是一个单独的问题。外部配置意味着连接字符串不会在平台、环境和版本之间改变,但最重要的是它允许 any CLI 或 ODBC 应用程序受益,而不仅仅是 python ibm_db,并让配置为 testable/verifiable,而不使用 python。