Nano Hash - криптовалюты, майнинг, программирование

Шифрование Oracle Advanced Security с XML-конфигурацией Spring JDBC

Есть ли способ внедрить функции шифрования Oracle Advanced Security в конфигурацию Spring JDBC dataSource?

Администратор базы данных сказал мне передать следующие аргументы в соединение на стороне клиента.

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

Согласно документации Oracle, шифрование может быть установить для тонкого драйвера, добавив аргументы в OracleConnection через старый добрый java.util.Properties.

Однако я не могу найти способ сделать это с моей конфигурацией Spring dataSource.xml.
Бин dataSource работает нормально:

<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 Я вижу, что упоминается лишь несколько атрибутов.
  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)

Я совсем запутался :(
Любая помощь или подсказка очень ценятся.

TL;TR
Есть ли решение для передачи этих свойств шифрования Oracle в Spring?


Ответы:


1

Свойства Oracle не указаны в Spring DataSource API, поэтому вам необходимо установить дополнительные свойства после инициализации компонента. Вы можете сделать это с помощью класса, который реализует beanpostprocessor. Кроме того, поскольку это Spring, вам нужно получить дескриптор текущего источника данных, чтобы установить дополнительные свойства, не взорвав инициализацию bean-компонента. Вы не можете использовать Autowire в классе, потому что постпроцессор пропустит этот компонент. Итак, вы должны бросить боб. Затем вы можете использовать setConnectionProperties для инициализации параметров, требуемых Oracle, вместо того, чтобы устанавливать свойства в компоненте Spring, который не будет работать и выдаст ошибку, описанную выше.

Также следует исправить название этой темы Безопасность-->Безопасность. Извините, если форматирование отключено, так как я новичок в публикации ответов.

@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;
    }
}
03.10.2019

2

Пожалуйста, обратитесь к 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);

Также см. раздел «Безопасность» документа Технический документ по стратегиям управления подключением, а также Безопасность Технический документ.

21.07.2016
  • Спасибо @Nirmala. Ваш пример подтолкнул меня в нужном направлении. Компонент XML кажется слишком строгим в этом отношении. 28.07.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..