我想在下面提到的springApplicationContext.xml
中保留编码密码有没有办法实现这个目标?
目前我已使用property-placeholder配置了所有属性 如下所示,但原始密码仍在我的database.properties
中打开<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>
但我的database.properties
db.driverClassName=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost/myDB
db.username=root
db.password=root
我想要以下内容:
<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>
但是我的database.properties
db.driverClassName=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost/myDB
db.username=root
db.password=3g6n72ef8x (using any encription method).
和我的dataSource在进行新的数据库连接之前在内部解密密码。
非常感谢您提供任何帮助/建议。
答案 0 :(得分:19)
我回答自己的问题可能很有趣。但我仍然想告诉我的解决方案,其他人可能会遇到同样的问题......
为简单起见,我使用过BASE64Encoder&amp; BASE64Decoder。稍后我将修改我的代码以使用安全/更好的加密/解密算法。
我已使用以下代码编码了我的数据库密码(例如:根据我的情况而定):
private String encode(String str) {
BASE64Encoder encoder = new BASE64Encoder();
str = new String(encoder.encodeBuffer(str.getBytes()));
return str;
}
并将编码后的密码放在我的database.properties文件中,如下所示:
前
db.driverClassName=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost/myDB
db.username=root
db.password=root
后
db.driverClassName=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost/myDB
db.username=root
db.password=cm9vdA== (Note: encoded 'root' by using BASE64Encoder)
现在我已经为org.apache.commons.dbcp.BasicDataSource编写了一个包装类 和重写的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;
}
}
这样我解码(BASE64Decoder)database.properties
中提供的编码密码并修改了springApplicationContext.xml文件中提到的dataSource bean的class属性。
<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>
感谢。
答案 1 :(得分:9)
创建自定义的PropertyPlaceHolderConfigurer,扩展Spring 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
...
}
}
}
您可以加密属性并附加 SomeText:。使用此自定义PropertyPlaceHolderConfigurer加载属性
答案 2 :(得分:3)
创建一个实现Datasource
接口的包装类,该接口将其方法调用委托给基础数据源,但在执行此操作之前解密密码。
答案 3 :(得分:3)
我想在这里查看大图:为什么要加密属性文件中的值?未经授权的人可以访问您的属性文件的情况是什么?
处理存储生产凭据这一更大问题的常用技术是将凭据作为环境的一部分而不是源代码的一部分。以下是一些方法:
答案 4 :(得分:0)
如果您使用tomcat连接池作为数据源,这是一个实现
http://www.jdev.it/encrypting-passwords-in-tomcat/
创建一个扩展org.apache.tomcat.jdbc.pool.DataSourceFactory并在server.xml中配置它的类