17

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

我想将加密的密码写入属性文件,我想知道 Spring 是否可以使用算法自动解密它。是否可以通过配置。先感谢您。

4

5 回答 5

8

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

于 2012-07-25T08:45:14.607 回答
6

我正在使用 spring 4 和 jasypt 1.9。Jasypt 文档没有为 spring 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);
    }

}

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

然后我简单地使用 spring EL 将属性解密回我的 spring config xml 中。

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

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

Use system args while bringing up your java process. 

例如:java -Dwhatismyencpawd="parashar"

并像使用它一样

encryptor.setPassword(java.lang.System.getProperty("whatismyencpawd"));

这样只有应用管理员知道密码。这种方式密码将作为 ps 命令的一部分在 UNIX 机器上可见。

或者您也可以配置和读取操作系统级别的环境变量。

于 2015-11-19T17:43:39.023 回答
2

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

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

于 2012-07-25T08:43:22.267 回答
1

可以使用spring cloud config提供的加解密

于 2017-01-10T17:52:38.673 回答
0

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

于 2014-01-24T22:17:47.980 回答