我是Spring框架中的新手,我使用Spring框架来管理我的数据库连接等等。 Applicaiton从属性文件中读取我的数据库连接参数。我需要的是将我的连接密码存储在属性文件中作为加密。 这是我的datasource xml文件
<?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>
我很想写加密到属性文件的密码,我想知道Spring是否可以自动使用算法解密它。是否可以配置。 提前谢谢。
答案 0 :(得分:7)
据我所知,Spring不支持此功能,但其他一些项目可能会有所帮助:
Jasypt library支持加密的应用程序配置(并且还与Spring集成)。查看详情:http://www.jasypt.org/encrypting-configuration.html
OWASP Project提供EncryptedProperties个接口,可以在您的应用中使用DefaultEncryptedProperties和ReferenceEncryptedProperties个实现。另见:https://www.owasp.org/index.php/How_to_encrypt_a_properties_file
答案 1 :(得分:6)
我正在使用spring 4和jasypt 1.9。 Jasypt文档没有提供对spring 4的明确支持。我找不到具有EncryptablePropertyPlaceholderConfigurer
依赖项的名为org.jasypt:jasypt:1.9.2
的类。
我写了一个简单的静态加密实用程序java类(它使用jasypt 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);
}
}
我使用此实用程序来加密我打算保存在我的属性文件中的密码。
然后我只使用spring EL在spring config xml中解密属性。
<property name="password" value="#{T(amit.parashar.EncryptionUtil).decrypt('${db.password}')}" />
编辑: 要回答如何隐藏加密密码:
Use system args while bringing up your java process.
例如:java -Dwhatismyencpawd =“parashar”
并像
一样使用它encryptor.setPassword(java.lang.System.getProperty("whatismyencpawd"));
这样只有应用管理员才能知道密码。这样,虽然在UNIX机器上,密码将作为ps命令的一部分显示。
或者您也可以配置和读取OS级环境变量。
答案 2 :(得分:1)
它没有任何意义,因为如果Spring可以解密它,那么其他人也可以。这种加密不会有任何区别,它不会保护任何东西。它只给出危险的东西 - 错误的保护感。
也许你可以使用另一种数据库身份验证方式,例如: MS SQL Server允许使用Windows安全性而不是密码身份验证。 Postgres也是如此(它通过用户帐户或使用SSL证书进行访问)。
答案 3 :(得分:1)
您可以使用spring cloud config
提供的encryption and decryption答案 4 :(得分:0)
您可以编写一个解密密码的bean,然后将bean注入需要密码的任何内容