使用Spring JDBC xml配置的Oracle Advanced Secuity加密

时间:2016-07-19 16:47:31

标签: spring oracle encryption jdbc configuration

有没有办法使Oracle先进的加密功能 Spring JDBC数据源配置的安全性?

DBA告诉我将以下参数传递给客户端的连接。

sqlnet.encryption_client = requested
sqlnet.encryption_types_client = (RC4_128)
sqlnet.crypto_checksum_client = requested
sqlnet.crypto_checksum_types_client = (MD5)

根据Oracle Documentation,可以通过旧的java.util.Properties将参数添加到OracleConnection,为瘦驱动程序设置加密。

但是,我找不到使用Spring dataSource.xml配置的方法。
dataSource bean工作正常:

<bean id="dataSource"
    class="oracle.jdbc.pool.OracleDataSource" destroy-method="close"> 
    <property name="URL" value="${datasource.url}" />
    <property name="user" value="${datasource.user}" />
    <property name="password" value="${datasource.password}" />
    <property name="connectionCachingEnabled" value="true"/>
</bean>

但遗憾的是,所需的属性并未被理解,并带来以下例外

Caused by: org.springframework.beans.NotWritablePropertyException: Invalid property 'encryption_client' of bean class [oracle.jdbc.pool.OracleDataSource]

<property name="encryption_client" value="${datasource.encryption_client}"/>
    <property name="encryption_types_client" value="${datasource.encryption_types_client}"/>
    <property name="crypto_checksum_client" value="${datasource.crypto_checksum_client}"/>
    <property name="crypto_checksum_types_client" value="${datasource.crypto_checksum_types_client}"/>
  1. Spring documentation中,我看到只提到了一些属性。
  2. 再看一下 Oracle文档中的示例,属性设置如下 OracleDataSource ods = new OracleDataSource();ods.setProperties(prop)
    ...但 API 没有setProperties()方法 (https:// docs.oracle.com/cd/E18283_01/appdev.112/e13995/oracle/jdbc/pool/OracleDataSource.html)
  3. 我很困惑:(
    任何帮助或提示都非常感谢。  

      

    TL; TR
    是否有将这些Oracle加密属性移交给Spring的解决方案?

2 个答案:

答案 0 :(得分:1)

Spring DataSource API中没有提供Oracle属性,因此必须在初始化bean之后设置其他属性。您可以使用实现“ beanpostprocessor”的类进行此操作。另外,由于这是Spring,因此您需要获取当前dataSource的句柄以设置其他属性,而不会破坏bean的init。您不能在类原因中使用Autowire,则PostProcessor将跳过该bean。因此,您必须浇铸豆。然后,您可以使用setConnectionProperties来初始化Oracle所需的参数,而不是在Spring bean中设置属性,该属性将不起作用并产生上述错误。

此外,您还应该修复此主题的标题安全性->安全性。很抱歉,如果格式不对,因为我是刚开始发布答案的人。

@Component
public class OracleConfigurer implements BeanPostProcessor {

@Override
public Object postProcessBeforeInitialization(Object bean, String name) throws BeansException {


final Logger LOG = LoggerFactory.getLogger(OracleConfigurer.class);
    if (bean instanceof DriverManagerDataSource) {
          Properties properties = ((DriverManagerDataSource) bean).getConnectionProperties();
          if (null == properties) properties = new Properties();
                properties.put("oracle.net.encryption_types_client", "(AES256)");
                properties.put("oracle.net.crypto_checksum_client", "REQUIRED");
                properties.put("oracle.net.encryption_client", "REQUIRED");
                DriverManagerDataSource dataSource = ((DriverManagerDataSource) bean);
                dataSource.setConnectionProperties(properties);
        }
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String name) throws
        BeansException {
        return bean;
    }
}

答案 1 :(得分:0)

请参阅具有安全相关连接属性的正确名称的OracleConnection。 例如:

Properties connProps = new Properties();

// For Data Integrity Check    connProps.setProperty(OracleConnection.CONNECTION_PROPERTY_THIN_NET_CHECKSUM_TYPES, "( MD5, SHA1, SHA256, SHA384 or SHA512 )");    connProps.setProperty(OracleConnection.CONNECTION_PROPERTY_THIN_NET_CHECKSUM_LEVEL, "REQUIRED");

// For Data Encryption    connProps.setProperty(OracleConnection.CONNECTION_PROPERTY_THIN_NET_ENCRYPTION_LEVEL, REQUIRED");    connProps.setProperty(OracleConnection.CONNECTION_PROPERTY_THIN_NET_ENCRYPTION_TYPES,"(DES40C)");

// OracleDataSource – Oracle JDBC Connection
OracleDataSource ods = new OracleDataSource();
ods.setConnectionProperties(connProps);

另请参阅Connection Management Strategies白皮书的安全部分以及Security白皮书。