有没有办法使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}"/>
OracleDataSource ods = new OracleDataSource();ods.setProperties(prop)
setProperties()
方法
(https:// docs.oracle.com/cd/E18283_01/appdev.112/e13995/oracle/jdbc/pool/OracleDataSource.html)我很困惑:(
任何帮助或提示都非常感谢。
TL; TR
是否有将这些Oracle加密属性移交给Spring的解决方案?
答案 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白皮书。