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ď č. 1Mož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