如何在Spring的属性文件中存储加密的密码

tac*_*ace 16 java encryption spring properties

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

我很想写加密到属性文件的密码,我想知道Spring是否可以自动解密它.是否可以配置.先感谢您.

Sla*_*hin 7

到目前为止,我知道Spring不支持这种能力,但其他一些项目可能会有所帮助:


Ami*_*har 6

我正在使用spring 4和jasypt 1.9.Jasypt文档不提供弹簧4.我无法找到命名的类明确的支持EncryptablePropertyPlaceholderConfigurerorg.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);
    }

}
Run Code Online (Sandbox Code Playgroud)

我使用此实用程序来加密我打算保留在我的属性文件中的密码.

然后我简单地用spring EL来解析我的spring config xml中的属性.

<property name="password" value="#{T(amit.parashar.EncryptionUtil).decrypt('${db.password}')}" />
Run Code Online (Sandbox Code Playgroud)

编辑:回答如何隐藏加密密码:

Use system args while bringing up your java process. 
Run Code Online (Sandbox Code Playgroud)

例如:java -Dwhatismyencpawd ="parashar"

并使用它

encryptor.setPassword(java.lang.System.getProperty("whatismyencpawd"));
Run Code Online (Sandbox Code Playgroud)

这样只有应用管理员才能知道密码.这样,虽然在UNIX机器上,密码将作为ps命令的一部分显示.

或者您也可以配置和读取OS级环境变量.


kan*_*kan 2

这没有任何意义,因为如果 Spring 可以解密它,那么其他人也可以。这种加密不会产生任何影响,它不会保护任何东西。它只会给人带来危险——虚假的保护感。

也许您可以使用另一种数据库身份验证方式,例如 MS SQL 服务器允许使用 Windows 安全性而不是密码身份验证。Postgres 也是如此(它通过用户帐户或使用 SSL 证书提供访问权限)。

  • 通过属性中的加密凭据,您可以将它们与需要它们的服务一起进行版本控制(显然不与私钥一起),并在部署服务时自动部署。在部署管道之外唯一需要维护的是用于解密属性的私钥,这比在服务的正常生命周期之外维护整个配置更不容易出错。 (4认同)
  • @tace 安全专用算法是矛盾的。http://en.wikipedia.org/wiki/Security_through_obscurity 。因此,一种正确的方法是使用操作系统保护(Windows NTLM、Unix pam 等),它可以提供一些保护。 (2认同)