java - 甲骨文 JDBC 瘦 : enforce network encryption

标签 java oracle jdbc

问题是如何使用 Oracle JDBC 瘦驱动程序并通过仅在 URL 中指定来强制加密?

据了解,我们需要将Oracle Net参数oracle.net.encryption_client设置为required。 (引用 link)

供引用:我们目前以TNS格式指定Oracle JDBC URL,例如:

DESCRIPTION = 
   (ADDRESS_LIST =
       (ADDRESS = (PROTOCOL = tcp)(HOST = myora1.corp.net)(PORT = 1521))
       (ADDRESS = (PROTOCOL = tcp)(HOST = myora2.corp.net)(PORT = 1521)))
   (FAILOVER=ON)
   (CONNECT_DATA = (SERVER = dedicated)(SERVICE_NAME = foobar))

转换为以下 JDBC URL 字符串:

jdbc:oracle:thin:@(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = tcp)(HOST = myora1.corp.net)(PORT = 1521))(ADDRESS = (PROTOCOL = tcp)(HOST = myora2.corp.net)(PORT = 1521)))(FAILOVER=ON)(CONNECT_DATA = (SERVER = dedicated)(SERVICE_NAME = foobar)))

在回答之前,您应该了解以下内容:

  1. 我们不能使用 Properties,因为这是第三方应用程序。我们只能设置 URL 字符串。
  2. 我们不能使用开放式加密(Oracle 中的默认设置)。出于监管原因,我们需要保证我们获得加密连接。我们需要从客户端强制执行此操作。 (我们需要保护自己免受服务器端潜在错误配置的影响)
  3. “加密”是指使用 Oracle 的内置加密方法,称为 Oracle Advanced Security,而不是 TLS。后者当然也是一个选项,但涉及更多(证书马戏团),并且 Oracle Advanced Security 被我们的安全专家认为“足够好”。
  4. 我们目前在 URL 中使用 TNS 描述符格式。如果另一种格式允许指定上述参数,encryption_client,那么可以改用该 URL 格式.. 只要它允许我们指定相同的参数,例如 ADDRESS_LIST。
  5. 我们可以替换正在使用的 JDBC 驱动程序,这意味着如果需要,我们可以自由使用最新版本。

我之前在 SO 上看到过这个问题,但没有得到正确的答案。

理想情况下,任何答案都应包含指向 Oracle 文档的指针。

最佳答案

如评论中所述,从 Oracle JDBC 驱动程序的 v21 开始,您可以使用 thin 方法的 Security 选项,如下所示:

jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=host)(PORT=1521))(CONNECT_DATA= (SERVICE_NAME=servicename))(Security=(ENCRYPTION_LEVEL=REQUIRED)))

因此您不需要属性,您可以在连接字符串中嵌入所需的加密级别。

您可以进一步限制加密算法以增加安全性,例如:

jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=host)(PORT=1521))(CONNECT_DATA= (SERVICE_NAME=servicename))(Security=(ENCRYPTION_CLIENT=REQUIRED)(ENCRYPTION_TYPES_CLIENT=AES256)))

有了这个我们就说连接必须加密并且必须用(当前)可用的最强算法加密。

参见:

Encryption Level JDBC String

Encryption Types JDBC String

关于java - 甲骨文 JDBC 瘦 : enforce network encryption,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69644315/

相关文章:

java - 与 postgres 的 spring JDBC 连接问题

java - 将 Java 字符串拆分为具有特殊字符和复杂情况的空格

Java Web App - 打印时隐藏打印对话框

java - 如何从java中的griven字符串中提取子字符串

sql - CASE when EXISTS (SELECT ...) 似乎总是返回 true

php - Codeigniter 和 oracle 未定义常量 : OCI_COMMIT_ON_SUCCESS

sql - 如何知道当用户向表中插入一条新记录时,是否自动生成了表示表主键的字段值?

tomcat - 在 JBoss AS 5.x 中使用 Tomcat 连接池

java - 在 Eclipse 和 unix 中运行 Junit

java - JNDI ClassCastException 与 tomcat 6.0.26