/ / Używanie zakodowanego hasła do źródła danych w aplikacji springContext.xml - wiosna, hibernacja, źródło danych, apache-commons-dbcp, szyfrowanie haseł

Używanie zakodowanego hasła do źródła danych w aplikacji springContext.xml - wiosna, hibernacja, źródło danych, apache-commons-dbcp, szyfrowanie haseł

Chcę zachować zakodowane hasło w poniższym pliku springApplicationContext.xml

Czy jest jakiś sposób, aby to osiągnąć?

obecnie skonfigurowałem wszystkie właściwości przy użyciu obiektu zastępczego jak pokazano poniżej, ale surowe hasło jest nadal otwarte w pliku database.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>

ale rzeczywiste wartości są obecne w moim database.properties

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

Chcę coś jak poniżej:

springApplicationContext.xml (tak jak powyżej)

<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>

Ale wartość właściwości hasła powinna być w moim formacie database.properties

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

i moje źródło danych wewnętrznie odszyfrowuje hasło przed nawiązaniem nowego połączenia DB.

Bardzo wdzięczni za wszelką pomoc / sugestię w tej sprawie.

Odpowiedzi:

19 dla odpowiedzi nr 1

To może być zabawne, że odpowiadam na własne pytanie. ale wciąż chciałem powiedzieć moje rozwiązanie, innym, którzy mogli mierzyć się z podobnym problemem.

dla uproszczenia użyłem BASE64Encoder i BASE64Decoder. później zmodyfikuję mój kod, aby użyć bezpiecznego / lepszego algorytmu szyfrowania / odszyfrowywania.

Zakodowałem hasło do bazy danych (np. Root dla mojego przypadku), używając poniższego kodu:

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

i umieścił zakodowane hasło w moim pliku database.properties, jak poniżej:

przed

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

po

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

Teraz napisałem klasy wrapper dla org.apache.commons.dbcp.BasicDataSource i zastąpiono metodę 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;
}
}

W ten sposób dekoduję (BASE64Decoder) zakodowane hasło w pliku database.properties

a także zmodyfikował atrybut klasy mojej fasoli źródła danych wymieniony w pliku 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>

Dzięki.


9 dla odpowiedzi nr 2

Utwórz dostosowany PropertyPlaceHolderConfigurer rozszerzający 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
...
}
}
}

Możesz zaszyfrować właściwości i dołączyć Jakiś tekst:. Użyj tego dostosowanego PropertyPlaceHolderConfigurer, aby załadować właściwości


3 dla odpowiedzi nr 3

Utwórz klasę opakowania implementującą Datasource interfejs, który deleguje wywołania metody do źródłowego źródła danych, ale odszyfrowuje hasło przed wykonaniem tego.


3 dla odpowiedzi № 4

Chciałbym spojrzeć na większy obrazek: dlaczego warto szyfrować wartości w pliku właściwości? Jaki jest scenariusz, w którym nieuprawnione osoby mają dostęp do pliku właściwości?

Zwykła technika radzenia sobie z tym większymProblem z przechowywaniem poświadczeń produkcyjnych polega na tym, aby dane uwierzytelniające stanowiły część środowiska, a nie część kodu źródłowego. Oto kilka sposobów, aby to zrobić:

  • Umieszczanie pliku właściwości (z hasłami tekstowymi) na ścieżce klasy produkowanego serwera sieciowego, w ten sposób dostęp do tego hasła jest kontrolowany przez dostęp do maszyny produkcyjnej.
  • Przechowuj właściwości w Internecie.xml (context-param with param-name), ponownie ten plik jest częścią środowiska, w którym uruchamiasz swój kod i nie jest on rozpowszechniany za pomocą twojego kodu - dostęp do tego pliku jest kontrolowany przez dostęp do urządzenia.
  • Użyj JNDI i skonfiguruj ten zasób na swoim serwerze aplikacji.

0 dla odpowiedzi № 5

Jeśli używasz puli połączeń tomcat jako źródła danych, oto implementacja

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

Utwórz klasę, która rozszerza org.apache.tomcat.jdbc.pool.DataSourceFactory i konfiguruj ją w pliku server.xml