2012-07-25 11 views
14

Soy muy nuevo en Spring framework y estoy usando Spring framework para administrar las conexiones de mi base de datos, etc. La aplicación lee mis parámetros de conexión db desde un archivo de propiedades. Lo que necesito es almacenar mi contraseña de conexión en el archivo de propiedad como encriptada. Aquí está mi archivo de fuente de datos XMLCómo almacenar la contraseña como encriptada en el archivo de propiedades en Spring

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

estoy Thiking a escribir la contraseña cifrada en el archivo de propiedades y me pregunto si la primavera puede descifrar con un algoritmo de forma automática. Es posible con la configuración Gracias de antemano.

Respuesta

1

No tiene ningún sentido, porque si el Spring puede descifrarlo, entonces todos los demás también podrían hacerlo. Esta encriptación no hará ninguna diferencia, no protege nada. Solo da algo peligroso: falso sentimiento de protección.

Quizás podría utilizar otra forma de autenticación de la base de datos, p. El servidor MS SQL permite usar la Seguridad de Windows en lugar de la autenticación con contraseña. Lo mismo para Postgres (da acceso por cuenta de usuario o usando certificados SSL).

+0

Tiene usted razón, pero lo menciono acerca de un algoritmo privado de la primavera, no pública. Gracias por su respuesta, buscaré la certificación SSL. – tace

+2

@tace Algoritmo privado para la seguridad es oxímoron. http://en.wikipedia.org/wiki/Security_through_obscurity. Entonces, la única manera de hacerlo bien es usar la protección del sistema de operación (Windows NTLM, Unix pam, etc.), podría proporcionar cierta protección. – kan

+2

Con las credenciales encriptadas en sus propiedades, puede mantenerlas controladas (no junto con la clave privada, obviamente) junto con el servicio que las necesita, y se implementan automáticamente al implementar el servicio. Lo único que debe mantenerse fuera de la línea de despliegue es la clave privada para descifrar las propiedades, que debería ser mucho menos propensa a errores que mantener toda la configuración fuera del ciclo de vida normal del servicio. –

7

Primavera En lo he conocido no es compatible con esta capacidad, sino algún otro proyecto puede ser servicial:

0

Se puede escribir un bean que descifra la contraseña y luego inyectar el frijol en lo que haga falta la contraseña

+0

¿hay alguna forma de inyectar en pom.xml? – fiddle

5

estoy usando muelle 4 y Jasypt 1.9. La documentación de Jasypt no proporciona soporte explícito para la primavera 4. No pude localizar la clase llamada EncryptablePropertyPlaceholderConfigurer con org.jasypt:jasypt:1.9.2 dependencia tampoco.

Escribí una clase java de utilidad de cifrado estático simple (esto usa la API jasypt).

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); 
    } 

} 

Utilicé esta utilidad para encriptar las contraseñas que tenía la intención de guardar en mis archivos de propiedades.

Luego simplemente usé el EL de primavera para descifrar las propiedades en mi configuración de primavera xml.

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

EDIT: Para contestar sobre cómo ocultar la contraseña de cifrado:

Use system args while bringing up your java process. 

por ejemplo,: Java -Dwhatismyencpawd = "Parashar"

y utilizarlo como

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

De esta manera sólo el administrador de aplicaciones sería conocer la contraseña. De esta forma, la contraseña será visible como parte del comando ps en una caja de UNIX.

o También puede configurar y leer desde la variable de entorno del nivel del sistema operativo.

+0

No entiendo, ahora ¿cómo puedo asegurar "parashar" porque si alguien verifica el código y puede descifrarlo, ¿verdad? –

+1

@Pasupathi He actualizado mi respuesta. –

0

Puede utilizar el encryption and decryption proporcionada por el resorte nube config

+0

Bien, pero ¿cómo? Esa página parece describir cómo usar el cliente y el servidor de la nube de primavera para recibir propiedades descifradas del servidor de configuración. Pero no tengo ningún interés en mantener un servicio solo para manejar las propiedades de descifrado, entonces, ¿cómo puedo extraer el mecanismo de descifrado de las propiedades en un contexto de aplicación de primavera normal? – ideasculptor

Cuestiones relacionadas