对spring applicationContext.xml中使用的数据源使用编码密码

San*_*ndy 21 spring hibernate datasource password-encryption apache-commons-dbcp

我想在下面提到的springApplicationContext.xml中保留编码密码

有没有办法实现这个目标?

目前我已使用property-placeholder配置了所有属性,如下所示,但原始密码仍在我的database.properties中打开

springApplicationContext.xml

<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>
Run Code Online (Sandbox Code Playgroud)

但实际值存在于我的 database.properties

db.driverClassName=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost/myDB
db.username=root
db.password=root
Run Code Online (Sandbox Code Playgroud)

我想要下面的东西:

springApplicationContext.xml(与上面相同)

<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>
Run Code Online (Sandbox Code Playgroud)

但是密码属性值应该是我的编目格式 database.properties

db.driverClassName=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost/myDB
db.username=root
db.password=3g6n72ef8x (using any encription method).
Run Code Online (Sandbox Code Playgroud)

我的dataSource在进行新的数据库连接之前在内部解密密码.

非常感谢任何帮助/建议.

San*_*ndy 19

我回答自己的问题可能很有趣.但我仍然想告诉我的解决方案,其他人可能会遇到同样的问题.

为简单起见,我使用了BASE64Encoder和BASE64Decoder.稍后我将修改我的代码以使用安全/更好的加密/解密算法.

我使用以下代码编码了我的数据库密码(例如:根据我的情况):

private String encode(String str) {
        BASE64Encoder encoder = new BASE64Encoder();
        str = new String(encoder.encodeBuffer(str.getBytes()));
        return str;
    }
Run Code Online (Sandbox Code Playgroud)

并将编码的密码放在我的database.properties文件中,如下所示:

之前

db.driverClassName=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost/myDB
db.username=root
db.password=root
Run Code Online (Sandbox Code Playgroud)

db.driverClassName=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost/myDB
db.username=root
db.password=cm9vdA==  (Note: encoded 'root' by using BASE64Encoder)
Run Code Online (Sandbox Code Playgroud)

现在我为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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这样我解码(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>
Run Code Online (Sandbox Code Playgroud)

谢谢.

  • Base64不加密,它的编码!虽然使用Base64算法对用户名和密码进行编码通常会使它们难以被肉眼读取,但它们与编码时一样容易解码.安全性不是编码步骤的目的.相反,编码的目的是将可能在用户名或密码中的非HTTP兼容字符编码为与HTTP兼容的字符. (7认同)
  • 此解决方案在您的属性文件中执行密码的base 64编码,但它未加密!我将粘贴的"cm9vdA =="复制到https://www.base64decode.org并立即获得"root".为了其他人阅读这个问题和答案,请修改问题,询问"如何使用base 64编码密码"而不是"如何使用加密密码",因为这个答案绝对不加密.我不希望其他读者认为编码与加密相同. (7认同)

Suj*_*ith 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
            ...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以加密属性并附加SomeText : . 使用此自定义PropertyPlaceHolderConfigurer加载属性