gpt4 book ai didi

java - 如何在 apache BasicDataSource 中使用加密密码?

转载 作者:太空狗 更新时间:2023-10-29 23:03:22 25 4
gpt4 key购买 nike

目前我将密码 [未加密] 保存在属性文件中。此密码使用 ant 按原样放置在配置 xml 中。
[配置xml是针对datasource的,就是创建dbcp.BasicDataSource的对象]

现在,是否有可能在 ant 目标之后以加密形式复制密码。听说 Jasypt 可以做到这一点!直到现在我还没有尝试过这个。但是,问题并没有就此结束。 BasicDataSource 不接受加密密码。有 BasicDatasource 的替代品吗?

仅供引用:如果重要的话,我正在使用 Spring。

最佳答案

对于 Spring,有一个更好的方法:使用 PropertyPlaceholderConfigurer类(class)。

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<value>classpath:com/foo/jdbc.properties</value>
</property>
<property name="propertiesPersister">
<bean class="com.mycompany.MyPropertyPersister" />
</property>
</bean>

<bean id="dataSource" destroy-method="close"
class="org.apache.commons.dbcp.BasicDataSource">
<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>

当您指定 PropertiesPersister 的子类时在属性占位符中,Spring 加载 jdbc.properties 并使用该类解密文件。也许是这样的:

public class MyPropertyPersister extends DefaultPropertiesPersister
{
// ... initializing stuff...

public void load(Properties props, InputStream is) throws IOException
{
Cipher decrypter = getCipher();
InputStream cis = new CipherInputStream(is, decrypter);
super.load(props, cis);
}

public void load(Properties props, Reader reader) throws IOException
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
IOUtils.copy(reader, baos);
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());

Cipher decrypter = getCipher();
InputStream cis = new CipherInputStream(bais, decrypter);

InputStreamReader realReader = new InputStreamReader(cis);
super.load(props, realReader);
}

public void loadFromXml(Properties props, InputStream is) throws IOException
{
Cipher decrypter = getCipher();
InputStream cis = new CipherInputStream(is, decrypter);
super.loadFromXml(props, cis);
}

private Cipher getCipher()
{
// return a Cipher to read the encrypted properties file
...
}
...
}

希望对您有所帮助。

编辑如果您使用 Jasypt,则不需要定义任何 PropertiesPersister。来自Jasypt documentation :

Jasypt provides an implementation of these configuration-related Spring classes which can read .properties files with encrypted values (like the ones managed by the EncryptableProperties class) and handle them transparently to the rest of the Spring application beans.

有了这个,你可以像这样定义jdbc.properties

 jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost/reportsdb
jdbc.username=reportsUser
jdbc.password=ENC(G6N718UuyPE5bHyWKyuLQSm02auQPUtm)

Spring的配置可能是这样的

<bean class="org.jasypt.spring.properties.EncryptablePropertyPlaceholderConfigurer">
<constructor-arg>
<bean class="org.jasypt.encryption.pbe.StandardPBEStringEncryptor">
<property name="config">
<bean class="org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig">
<property name="algorithm" value="PBEWithMD5AndDES" />
<property name="passwordEnvName" value="APP_ENCRYPTION_PASSWORD" />
</bean>
</property>
</bean>
</constructor-arg>
<property name="locations">
<list>
<value>/WEB-INF/classes/jdbc.properties</value>
</list>
</property>
</bean>

<bean id="dataSource" destroy-method="close"
class="org.apache.commons.dbcp.BasicDataSource">
<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>

这样,您可以在启动应用程序时将解密隐藏属性的密码放在环境变量中,稍后再取消设置。

关于java - 如何在 apache BasicDataSource 中使用加密密码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3423135/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com