我想在下面提到的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
database.properties
db.driverClassName=com.mysql.jdbc.Driver db.url=jdbc:mysql://localhost/myDB db.username=root db.password=root
我想要以下内容:
但是我的密码属性值应为加密格式 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在建立新的数据库连接之前在内部解密密码。
非常感谢您对此提供的任何帮助/建议。
我回答自己的问题可能很有趣。但我还是想告诉我解决方案,其他可能也遇到过类似问题的人。
为简单起见,我使用了BASE64Encoder和BASE64Decoder。稍后,我将修改代码以使用安全/更好的加密/解密算法。
我已经使用以下代码对数据库密码(例如:root)进行了编码:
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=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>
谢谢。