Użycie zakodowanego hasła do źródła danych używanego w aplikacji springcontext.xml

Chcę zachować zakodowane hasło w moim niżej wymienionym springapplicationkontekst.xml

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

Obecnie skonfigurowałem wszystkie właściwości używając property-placeholder jak pokazano poniżej, ale surowe hasło jest nadal otwarte w mojej bazie danych.właściwości

Spring Applicationkontekst.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ś takiego jak poniżej:

Spring Applicationkontekst.xml (taki sam jak above)

<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ć zapisana w 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 dataSource wewnętrznie odszyfrować hasło przed nawiązaniem nowego połączenia DB.

Bardzo doceniam każdą pomoc/sugestię w tym.

Author: Sandy, 2012-10-11

5 answers

To może być zabawne, że odpowiadam na własne pytanie. ale mimo to chciałem tylko powiedzieć moje rozwiązanie, inni, którzy mogą mieć do czynienia z tego samego rodzaju problem..

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

Zakodowałem hasło do bazy danych (np: root dla mojego przypadku) za pomocą 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 mojej bazie danych.plik właściwości 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 klasę wrapper dla org.Apacz.commons.dbcp.BasicDataSource i nadpisana metoda 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 podane w bazie danych.właściwości

A także zmodyfikował atrybut klasy mojego dataSource Bean, o którym mowa w Spring applicationcontext.plik 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.
 19
Author: Sandy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-11 12:22:48

Tworzenie niestandardowego PropertyPlaceHolderConfigurer Rozszerzanie 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ć SomeText: . Użyj tego niestandardowego PropertyPlaceHolderConfigurer, aby załadować właściwości

 9
Author: Sujith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-26 09:53:28

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

 3
Author: Abhinav Sarkar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-11 07:50:04

Chciałbym spojrzeć na szerszy obraz tutaj: Dlaczego chcesz szyfrować wartości w pliku właściwości? Jaki jest twój scenariusz, w którym nieupoważnione osoby mają dostęp do Twojego pliku właściwości?

Zwykłą techniką radzenia sobie z tym większym problemem przechowywania poświadczeń produkcyjnych jest uczynienie poświadczeń częścią środowiska, a nie częścią kodu źródłowego. Oto kilka sposobów na to:

  • umieszczenie pliku właściwości (z hasłami tekstowymi) na classpath serwera www w produkcji, w ten sposób dostęp do tego hasła jest kontrolowany przez dostęp do maszyny produkcyjnej.
  • przechowuj właściwości w sieci.xml (context-param with param-name), ponownie ten plik jest częścią środowiska, w którym uruchamiasz kod i nie jest dystrybuowany wraz z kodem - dostęp do tego pliku jest kontrolowany przez dostęp do maszyny.
  • Użyj JNDI i Skonfiguruj ten zasób na serwerze aplikacji.
 3
Author: Jay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-11 19:01:05

Jeśli używasz Tomcat connection pool jako źródła danych, oto implementacja

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

Tworzenie klasy rozszerzającej org.Apacz.tomcat.jdbc.basen.DataSourceFactory i skonfigurować go na serwerze.xml

 0
Author: Sujith Nair,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-14 06:33:20