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

Java 如何在Spring的属性文件中加密存储密码,java,spring,encryption,properties,Java,Spring,Encryption,Properties,我是Spring框架的新手,我正在使用Spring框架来管理我的数据库连接等等。Application从属性文件读取my db连接参数。我需要的是将我的连接密码以加密方式存储在属性文件中。 这是我的数据源xml文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3

我是Spring框架的新手,我正在使用Spring框架来管理我的数据库连接等等。Application从属性文件读取my db连接参数。我需要的是将我的连接密码以加密方式存储在属性文件中。 这是我的数据源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>

文件:${DBConfigFile}
3.
3.
50
200
1.
0
3.
我想把加密的密码写入属性文件,我想知道Spring是否能用算法自动解密它。配置是否可能。
提前谢谢你。

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


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

据我所知,Spring不支持此功能,但其他一些项目可能会有所帮助:

  • 提供对加密应用程序配置的支持(并与Spring集成)。详情见:

  • 提供可在应用程序中使用的接口和实现。另见:


您可以编写一个bean来解密您的密码,然后将bean注入任何需要密码的地方

我正在使用spring 4和jasypt 1.9。Jasypt文档没有为Spring4提供明确的支持。我也找不到名为
EncryptablePropertyPlaceHolderConfigure
且具有
org.jasypt:jasypt:1.9.2
依赖项的类

我编写了一个简单的静态加密实用程序java类(它使用jasypt API)

我使用这个实用程序来加密我打算保存在属性文件中的密码

然后,我简单地使用SpringEL将属性解密回我的SpringConfigXML中

<property name="password" value="#{T(amit.parashar.EncryptionUtil).decrypt('${db.password}')}" />
例如:java-Dwhatismyencpawd=“parashar”

像这样使用它

encryptor.setPassword(java.lang.System.getProperty("whatismyencpawd"));
这样,只有应用程序管理员才知道密码。这样,密码将作为ps命令的一部分在UNIX框中可见


或者,您也可以配置并读取OS级环境变量。

您可以使用spring cloud config提供的

您是对的,但我提到的是spring的私有算法,而不是公共算法。谢谢你的回答,我将搜索ssl认证。@tace安全专用算法是矛盾的。因此,一种正确的方法是使用操作系统保护(Windows NTLM、Unix pam等),它可以提供一些保护。通过在属性中加密凭据,您可以将它们与需要它们的服务一起保持版本控制(显然不是与私钥一起),并在部署服务时自动部署。唯一需要在部署管道之外维护的是用于解密属性的私钥,这应该比在服务的正常生命周期之外维护整个配置容易出错的多。@SebastianGanslandt如果您能够在系统中安全维护私钥文件,那你到底为什么需要它呢?这有什么区别?我认为这只会让整个事情变得更加困难——你需要维护密钥,引入一个安全的过程来更改密码,并添加这个特殊的magic Spring配置。吻在我们的项目中,我们有一个外部的“security.properties”文件,它定义了所有敏感信息,并且从不离开部署目标服务器。这实际上是我在转向加密属性之前考虑的解决方案,当内置spring支持的想法仍然存在时,加密属性看起来更优雅了。好的,但是如何实现呢?该页面似乎描述了如何使用SpringCloud客户端和服务器从配置服务器接收解密的属性。但是我对维护一个只处理解密属性的服务不感兴趣,那么我如何将属性的解密机制拉到一个普通的spring应用程序上下文中呢?我不明白,现在我该如何保护“parashar”,因为如果有人检查代码,他/她可以正确解密?有没有办法不在pom.xml中注入?
Use system args while bringing up your java process. 
encryptor.setPassword(java.lang.System.getProperty("whatismyencpawd"));