Как хранить пароль как зашифрованный в файле свойств в Spring - программирование
Подтвердить что ты не робот

Как хранить пароль как зашифрованный в файле свойств в Spring

Я очень новичок в структуре Spring, и я использую фреймворк Spring для управления подключениями к базе данных и так далее. Applicaiton считывает мои параметры подключения db из файла свойств. То, что мне нужно, - это сохранить мой пароль подключения в файле свойств как зашифрованный. Вот мой XML файл datasource

    <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">

    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location">
            <value>file:${DBConfigFile}</value>
        </property>
    </bean>

    <bean id="myDataSource"   class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        <property name="driverClass" value="${jdbc.driverClassName}" />
        <property name="jdbcUrl" value="${jdbc.url}" />
        <property name="user" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
        <property name="initialPoolSize"><value>3</value></property>
        <property name="minPoolSize"><value>3</value></property>
        <property name="maxPoolSize"><value>50</value></property>
        <property name="idleConnectionTestPeriod"><value>200</value></property>
        <property name="acquireIncrement"><value>1</value></property>
        <property name="maxStatements"><value>0</value></property>
        <property name="numHelperThreads"><value>3</value></property>
    </bean>

</beans>

Я собираюсь написать пароль, зашифрованный в файл свойств, и мне интересно, сможет ли Spring дешифровать его с помощью алгоритма автоматически. Возможно ли это с конфигурацией. Заранее благодарю вас.

4b9b3361

Ответ 1

Насколько я знаю, Spring не поддерживает эту способность, но может быть полезен и другой проект:

Ответ 2

Я использую spring 4 и jasypt 1.9. Документация Jasypt не предоставляет явной поддержки для spring 4. Я не смог найти класс с именем EncryptablePropertyPlaceholderConfigurer с зависимостью org.jasypt:jasypt:1.9.2.

Я написал простую статическую утилиту java class для шифрования (это использует jasypt API).

public class EncryptionUtil {
    static PooledPBEStringEncryptor encryptor = null;
    static {
        encryptor = new PooledPBEStringEncryptor();
        encryptor.setPoolSize(4); 
        //  There are various approaches to pull this configuration via system level properties. 
        encryptor.setPassword("parashar");
        encryptor.setAlgorithm("PBEWITHMD5ANDDES");
    }

    public static String encrypt(String input) {
        return encryptor.encrypt(input);
    }

    public static String decrypt(String encryptedMessage) {
        return encryptor.decrypt(encryptedMessage);
    }

}

Я использовал эту утилиту для шифрования паролей, которые я собирался хранить в файлах свойств.

Затем я просто использовал spring EL, чтобы дешифровать свойства в моем spring config xml.

<property name="password" value="#{T(amit.parashar.EncryptionUtil).decrypt('${db.password}')}" />

ИЗМЕНИТЬ: Ответ на вопрос о том, как скрыть пароль шифрования:

Use system args while bringing up your java process. 

например.: java -Dwhatismyencpawd = "parashar"

и используйте его как

encryptor.setPassword(java.lang.System.getProperty("whatismyencpawd"));

Таким образом, только администратор приложения будет знать пароль. Таким образом, пароль будет отображаться как часть команды ps, но в поле UNIX.

или вы также можете настроить и прочитать из переменной среды уровня ОС.

Ответ 3

Это не имеет никакого смысла, потому что если Spring может расшифровать его, то все остальные тоже могут. Это шифрование не имеет никакого значения, оно ничего не защищает. Это дает только опасную вещь - ложное чувство защиты.

Возможно, вы могли бы использовать другой способ аутентификации базы данных, например. Сервер MS SQL позволяет использовать Windows Security вместо аутентификации паролем. То же самое для Postgres (он дает доступ к учетной записи пользователя или использует SSL-сертификаты).

Ответ 4

Вы можете написать bean, который расшифровывает ваш пароль, а затем вводит bean во все, что необходимо для пароля