Подтвердить что ты не робот

Использование закодированного пароля для источника данных, используемого в spring applicationContext.xml

Я хочу сохранить закодированный пароль в моей упомянутой ниже springApplicationContext.xml

Есть ли способ достичь этого?

В настоящее время я настроил все свойства, используя свойство-placeholder как показано ниже, но исходный пароль все еще открыт в моей базе данных .properties

springApplicationContext.xml

<beans:bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <beans:property name="driverClassName"><beans:value>${db.driverClassName}</beans:value></beans:property>
        <beans:property name="url"><beans:value>${db.url}</beans:value></beans:property>
        <beans:property name="username"><beans:value>${db.username}</beans:value></beans:property>
        <beans:property name="password"><beans:value>${db.password}</beans:value></beans:property>
</beans:bean>

но фактические значения присутствуют в моем database.properties

db.driverClassName=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost/myDB
db.username=root
db.password=root

Мне нужно что-то вроде ниже:

springApplicationContext.xml(как указано выше)

<beans:bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <beans:property name="driverClassName"><beans:value>${db.driverClassName}</beans:value></beans:property>
        <beans:property name="url"><beans:value>${db.url}</beans:value></beans:property>
        <beans:property name="username"><beans:value>${db.username}</beans:value></beans:property>
        <beans:property name="password"><beans:value>${db.password}</beans:value></beans:property>
</beans:bean>

Но значение свойства пароля должно быть в указанном формате в моем database.properties

db.driverClassName=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost/myDB
db.username=root
db.password=3g6n72ef8x (using any encription method).

и мой источник данных внутренне расшифровывает пароль перед созданием нового соединения с БД.

Высоко ценим за любую помощь/предложение в этом.

4b9b3361

Ответ 1

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

для простоты я использовал BASE64Encoder и BASE64Decoder. позже я изменю свой код, чтобы использовать безопасный/лучший алгоритм шифрования/дешифрования.

Я закодировал свой пароль базы данных (например: root для моего случая), используя приведенный ниже код:

private String encode(String str) {
        BASE64Encoder encoder = new BASE64Encoder();
        str = new String(encoder.encodeBuffer(str.getBytes()));
        return str;
    }

и поместил закодированный пароль в файл database.properties, как показано ниже:

перед

db.driverClassName=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost/myDB
db.username=root
db.password=root

после

db.driverClassName=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost/myDB
db.username=root
db.password=cm9vdA==  (Note: encoded 'root' by using BASE64Encoder)

Теперь я написал класс-оболочку для org.apache.commons.dbcp.BasicDataSource и переопределенный метод setPassword():

import java.io.IOException;
import org.apache.commons.dbcp.BasicDataSource;
import sun.misc.BASE64Decoder;

public class MyCustomBasicDataSource extends BasicDataSource{

    public CustomBasicDataSource() {
        super();
    }

    public synchronized void setPassword(String encodedPassword){
        this.password = decode(encodedPassword);
    }

    private String decode(String password) {
        BASE64Decoder decoder = new BASE64Decoder();
        String decodedPassword = null;
        try {
            decodedPassword = new String(decoder.decodeBuffer(password));
        } catch (IOException e) {
            e.printStackTrace();
        }       
        return decodedPassword;
    }
}

Таким образом, я декодирую (BASE64Decoder) закодированный пароль, предоставленный в database.properties

а также изменил атрибут class моего dataSource bean, упомянутый в файле springApplicationContext.xml.

<beans:bean id="dataSource" class="edu.config.db.datasource.custom.MyCustomBasicDataSource" destroy-method="close">
    <beans:property name="driverClassName"><beans:value>${db.driverClassName}</beans:value></beans:property>
    <beans:property name="url"><beans:value>${db.url}</beans:value></beans:property>
    <beans:property name="username"><beans:value>${db.username}</beans:value></beans:property>
    <beans:property name="password"><beans:value>${db.password}</beans:value></beans:property>

Спасибо.

Ответ 2

Создайте настраиваемый PropertyPlaceHolderConfigurer, расширяющий Spring PropertyPlaceHolderConfigurer

public class PropertyPlaceholderConfigurer extends
        org.springframework.beans.factory.config.PropertyPlaceholderConfigurer {

    @Override
    protected String convertPropertyValue(final String originalValue) {
        if (originalValue.startwith("SomeText:")) {
            //Apply the decryption logic
            ...
        }
    }
}

Вы можете зашифровать свойства и добавить SomeText:. Используйте этот настраиваемый PropertyPlaceHolderConfigurer для загрузки свойств

Ответ 3

Создайте класс-оболочку, реализующий интерфейс Datasource, который делегирует вызов метода базовому источнику данных, но расшифровывает пароль перед этим.

Ответ 4

Я хотел бы посмотреть на картинку большего размера: зачем вы хотите шифровать значения в вашем файле свойств? Каков ваш сценарий, когда несанкционированные пользователи имеют доступ к вашему файлу свойств?

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

  • Размещение файла свойств (с открытым текстом паролей) в пути к классам веб-сервера в процессе производства, таким образом доступ к этому паролю контролируется доступом к производственной машине.
  • Сохранять свойства в web.xml(context-param с param-name), опять же этот файл является частью среды, в которой вы запускаете свой код и не распространяетесь вместе с вашим кодом. Доступ к этому файлу контролируется доступом к машина.
  • Используйте JNDI и настройте этот ресурс на своем сервере приложений.

Ответ 5

Если вы используете пул соединений tomcat в качестве источника данных, вот реализация

http://www.jdev.it/encrypting-passwords-in-tomcat/

Создайте класс, который расширяет файл org.apache.tomcat.jdbc.pool.DataSourceFactory и настроит его в файле server.xml.