Использование закодированного пароля для источника данных, используемого в 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).
и мой источник данных внутренне расшифровывает пароль перед созданием нового соединения с БД.
Высоко ценим за любую помощь/предложение в этом.
Ответы
Ответ 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.