Spring JDBC Template-解密密码

时间:2015-09-15 08:37:10

标签: java spring encryption jdbc

我使用Spring JDBC模板建立与数据库的连接。密码采用加密格式,并希望借助JDBC模板对其进行解密。为了实现这一点,我开始知道我必须覆盖" DriverManagerDataSource"我试图实现相同但没有成功。

<bean id="dataSource"
    class="MyclassName">
    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
</bean>

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource"></property>
</bean>

public class MyclassName extends DriverManagerDataSource {

 @Override
    public String getPassword() {
        String password = super.getPassword();
        //External API decryption call
    EncrypterClassName encrypterClassName = new EncrypterClassName();
        return encrypterClassName.decrypt(password);
    }

}

我知道我必须更改<property name="password" value="${jdbc.password}"来调用我已经实现的类但不确定如何执行相同操作。 谢谢。

1 个答案:

答案 0 :(得分:0)

我编写了自己的ProperyPlaceholderConfigurer,每当必须替换变量时都会调用它。

jdbc.password={base64}yourEncryptedSecret

import java.io.IOException;
import sun.misc.BASE64Decoder;
public class PropertyPlaceholderConfigurer
  extends org.springframework.beans.factory.config.PropertyPlaceholderConfigurer {

  @Override
  protected String convertPropertyValue(final String originalValue) {
    String cryptString = "{base64}";
    if (originalValue.startsWith(cryptString)) {
      BASE64Decoder decoder = new BASE64Decoder();
      String decodedPassword = null;
      try {
        decodedPassword = new String(decoder.decodeBuffer(originalValue.substring(cryptString.length())));
      } catch (IOException e) {
        e.printStackTrace();
      }
      return decodedPassword;
    }
    return originalValue;
  }
}