/ / Použitie zakódovaného hesla pre zdroj údajov použitý v jarnom aplikáciiContext.xml - jar, hibernácia, dátový zdroj, apache-commons-dbcp, šifrovanie heslom

Použitie kódovaného hesla pre zdroj údajov použitý v jarnom aplikáciiContext.xml - jar, hibernácia, dátový zdroj, apache-commons-dbcp, šifrovanie hesla

Chcem mať kódované heslo v mojom spomenutom springApplicationContext.xml

Existuje nejaký spôsob, ako to dosiahnuť?

v súčasnosti som nakonfiguroval všetky vlastnosti pomocou vlastníka-zástupcu ako je uvedené nižšie, ale surové heslo je stále otvorené v mojom 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 skutočné hodnoty sú prítomné v mojom database.properties

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

Chcem niečo ako nižšie:

springApplicationContext.xml (rovnako ako vyššie)

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

Hodnota vlastností hesla by mala byť v zapísanom formáte v mojom database.properties

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

a môj dátový zdroj interne dešifrovať heslo predtým, než vytvorí nové DB pripojenie.

Veľmi si vážime akúkoľvek pomoc / návrh v tomto.

odpovede:

19 pre odpoveď č. 1

Možno je to smiešne, že odpoviem na svoju vlastnú otázku. ale stále som chcel povedať moje riešenie, iní, ktorí by mohli čeliť rovnakému problému ..

pre jednoduchosť som použil BASE64Encoder & BASE64Decoder. neskôr upravím môj kód tak, aby používal bezpečný / lepší šifrovací / dešifrovací algoritmus.

Mám zakódované heslo svojej databázy (napr. Root pre môj prípad) pomocou nižšie uvedeného kódu:

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

a umiestnil kódované heslo do môjho súboru database.properties, ako je uvedené nižšie:

pred

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 som napísal triedu wrapper pre org.apache.commons.dbcp.BasicDataSource a prepísaná metóda 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;
}
}

Týmto spôsobom dekódujem (BASE64Decoder) kódované heslo poskytnuté v databáze.properties

a tiež upravil atribút triedy môjho dátového zdroja spomenutého v súbore 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>

Vďaka.


9 pre odpoveď č. 2

Vytvorte prispôsobený parameter PropertyPlaceHolderConfigurer, ktorý sa rozširuje na jar 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
...
}
}
}

Môžete šifrovať vlastnosti a pridať SomeText:, Použite tento vlastný PropertyPlaceHolderConfigurer na načítanie vlastností


3 pre odpoveď № 3

Vytvorte triedu wrapperu, ktorá implementuje Datasource rozhranie, ktoré deleguje jeho metódy na základné zdroje dát, ale dešifruje heslo pred tým.


3 pre odpoveď č. 4

Chcel by som sa pozrieť na väčší obrázok tu: prečo chcete zašifrovať hodnoty vo vašom súbore vlastností? Aký je váš scenár, v ktorom majú neoprávnené osoby prístup k vášmu súboru vlastností?

Zvyčajná technika na zvládnutie tohto väčšiehoproblém ukladania poverení výroby je urobiť poverenia súčasťou vášho prostredia na rozdiel od časti vášho zdrojového kódu. Tu je niekoľko spôsobov, ako to urobiť:

  • Umiestnenie súboru vlastností (s otvorenými heslami) na classpath webového servera vo výrobe, tak prístup k tomuto heslu je riadený prístupom k výrobnému stroji.
  • Ukladať vlastnosti na webe.xml (parameter-param s param-name), tento súbor je opäť súčasťou prostredia, v ktorom spúšťate svoj kód a nie je distribuovaný s vaším kódom - prístup k tomuto súboru je riadený prístupom k zariadeniu.
  • Použite JNDI a nakonfigurujte tento zdroj na aplikačnom serveri.

0 pre odpoveď č. 5

Ak používate fond pre pripojenie Tomcat ako zdroj údajov, je tu implementácia

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

Vytvorte triedu, ktorá rozširuje org.apache.tomcat.jdbc.pool.DataSourceFactory a nakonfigurujte ju v server.xml