2012-07-25 7 views
14

Ich bin sehr neu in Spring Framework und ich benutze Spring-Framework, um meine Datenbankverbindungen und so weiter zu verwalten. Anwendung liest meine DB Verbindungsparameter aus einer Eigenschaftendatei. Was ich brauche, ist, mein Verbindungspasswort in der Eigenschaftendatei verschlüsselt zu speichern. Hier ist meine Datenquelle xmlWie man das Passwort verschlüsselt in der Eigenschaftendatei im Frühjahr speichert

Datei
<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:tx="http://www.springframework.org/schema/tx" 
     xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd 
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"> 

    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
     <property name="location"> 
      <value>file:${DBConfigFile}</value> 
     </property> 
    </bean> 

    <bean id="myDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> 
     <property name="driverClass" value="${jdbc.driverClassName}" /> 
     <property name="jdbcUrl" value="${jdbc.url}" /> 
     <property name="user" value="${jdbc.username}" /> 
     <property name="password" value="${jdbc.password}" /> 
     <property name="initialPoolSize"><value>3</value></property> 
     <property name="minPoolSize"><value>3</value></property> 
     <property name="maxPoolSize"><value>50</value></property> 
     <property name="idleConnectionTestPeriod"><value>200</value></property> 
     <property name="acquireIncrement"><value>1</value></property> 
     <property name="maxStatements"><value>0</value></property> 
     <property name="numHelperThreads"><value>3</value></property> 
    </bean> 

</beans> 

Ich thiking das Passwort zu Property-Datei verschlüsselt zu schreiben, und ich frage mich, ob Frühling es mit einem Algorithmus automatisch entschlüsseln kann. Ist es mit Konfiguration möglich? Vielen Dank im Voraus.

Antwort

1

Es ergibt keinen Sinn, denn wenn der Spring es entschlüsseln kann, dann könnte es auch jeder andere tun. Diese Verschlüsselung macht keinen Unterschied, sie schützt nichts. Es gibt nur gefährliche Sache - falsches Gefühl des Schutzes.

Vielleicht könnten Sie eine andere Art der Datenbankauthentifizierung verwenden, z. Der MS SQL-Server ermöglicht die Verwendung der Windows-Sicherheit anstelle der Kennwortauthentifizierung. Das Gleiche gilt für Postgres (es gibt Zugriff durch Benutzerkonto oder Verwendung von SSL-Zertifikaten).

+0

Sie haben Recht, aber ich erwähne über einen privaten Algorithmus des Frühlings, nicht um ein öffentliches. Vielen Dank für Ihre Antwort, ich werde über SSL-Zertifizierung suchen. – tace

+2

@tace Private Algorithmus für Sicherheit ist Oxymoron. http://en.wikipedia.org/wiki/Security_through_obsicurity. Also, die eine Möglichkeit, es richtig zu machen, ist Betriebssystem-Schutz (Windows NTLM, Unix Pam, etc), könnte es einige Schutz bieten. – kan

+2

Mit verschlüsselten Anmeldeinformationen in Ihren Eigenschaften können Sie diese versionsgesteuert (nicht offensichtlich zusammen mit dem privaten Schlüssel) zusammen mit dem Dienst halten, der sie benötigt, und automatisch bei der Bereitstellung des Dienstes bereitstellen. Das einzige, was außerhalb der Bereitstellungs-Pipeline gepflegt werden muss, ist der private Schlüssel zum Entschlüsseln der Eigenschaften, der weit weniger fehleranfällig sein sollte als das Beibehalten der gesamten Konfiguration außerhalb des normalen Lebenszyklus des Dienstes. –

7

Soweit ich bekannt Frühling nicht unterstützt diese Fähigkeit, aber einige andere Projekt hilfreich sein kann:

0

Sie eine Bohne schreiben könnte, die Ihr Passwort entschlüsselt und dann injizieren, um die Bohnen in dem, was das Passwort

+0

Gibt es eine Möglichkeit, in pom.xml zu injizieren? – fiddle

5

braucht Ich bin mit Feder 4 und jasypt 1.9. Die Jasypt-Dokumentation bietet keine explizite Unterstützung für Frühling 4. Ich konnte die Klasse EncryptablePropertyPlaceholderConfigurer mit der org.jasypt:jasypt:1.9.2-Abhängigkeit entweder nicht finden.

Ich schrieb ein einfaches Dienstprogramm zur statischen Verschlüsselung Java-Klasse (das verwendet jasept API).

public class EncryptionUtil { 
    static PooledPBEStringEncryptor encryptor = null; 
    static { 
     encryptor = new PooledPBEStringEncryptor(); 
     encryptor.setPoolSize(4); 
     // There are various approaches to pull this configuration via system level properties. 
     encryptor.setPassword("parashar"); 
     encryptor.setAlgorithm("PBEWITHMD5ANDDES"); 
    } 

    public static String encrypt(String input) { 
     return encryptor.encrypt(input); 
    } 

    public static String decrypt(String encryptedMessage) { 
     return encryptor.decrypt(encryptedMessage); 
    } 

} 

Ich benutzte dieses Dienstprogramm, um die Kennwörter zu verschlüsseln, die ich in meinen Eigenschaftendateien behalten wollte.

Ich habe dann einfach Feder EL verwendet, um die Eigenschaften in meiner Spring Config Xml zu entschlüsseln.

<property name="password" value="#{T(amit.parashar.EncryptionUtil).decrypt('${db.password}')}" /> 

EDIT: zu beantworten, wie das Verschlüsselungskennwort zu verbergen:

Use system args while bringing up your java process. 

für z.B.: Java -Dwhatismyencpawd = "Parashar"

und verwenden Sie es wie

encryptor.setPassword(java.lang.System.getProperty("whatismyencpawd")); 

Auf diese Weise nur die App Admin das Passwort kennen würde. Auf diese Weise wird das Passwort als Teil des Befehls ps auf einer UNIX-Box angezeigt.

oder Sie können auch Umgebungsvariable auf Betriebssystemebene konfigurieren und lesen.

+0

Ich verstehe nicht, jetzt, wie werde ich "parashar" sichern, wenn jemand den Code überprüfen und er/sie kann richtig entschlüsseln? –

+1

@Pasupathi Ich habe meine Antwort aktualisiert. –

0

können Sie die durch Federwolke Config bereitgestellt encryption and decryption verwenden

+0

OK, aber wie? Auf dieser Seite wird beschrieben, wie Sie den Spring Cloud-Client und -Server zum Entschlüsseln von Eigenschaften vom Konfigurationsserver verwenden. Aber ich habe kein Interesse daran, einen Dienst nur für die Verarbeitung von Entschlüsselungseigenschaften zu unterhalten. Wie kann ich also den Entschlüsselungsmechanismus für Eigenschaften in einen normalen Kontext der Federanwendung bringen? – ideasculptor

Verwandte Themen