我试图让 jasypt 解密(以前加密的)属性值,最终将用于登录数据库。除了我引入 Maven 配置文件时,解密工作正常。我有一组特定于环境的本地/开发/产品属性文件。
这是我的 spring3 配置的相关部分。这是代码示例中最关键的部分:这决定了解密的设置方式以及为示例虚拟 bean 设置的解密字符串。
<bean id="jvmVariablesConfiguration" class="org.jasypt.encryption.pbe.config.EnvironmentPBEConfig"
p:password="secret_password_here"/>
<bean id="jvmConfigurationEncryptor" class="org.jasypt.encryption.pbe.StandardPBEStringEncryptor"
p:config-ref="jvmVariablesConfiguration"/>
<bean id="jvmPropertyConfigurer" class="org.jasypt.spring3.properties.EncryptablePropertyPlaceholderConfigurer"
p:locations-ref="passwordProps">
<constructor-arg ref="jvmConfigurationEncryptor"/>
</bean>
<util:list id="passwordProps">
<value>classpath:database.properties</value>
</util:list>
<encryption:encryptable-properties id="dbProps" encryptor="jvmConfigurationEncryptor" location="classpath:database.properties"/>
<bean id="dummy" class="DummyPropertyTest">
<property name="prop" value="${database.bar}"/>
</bean>
在我的一个 maven pom 中,这里是我指定配置文件的地方。
...
<profiles>
<profile>
<id>local</id>
<properties>
<build.profile.id>local</build.profile.id>
</properties>
<build>
<filters>
<filter>src/main/resources/properties/${build.profile.id}/database.properties</filter>
</filters>
<resources>
<resource>
<filtering>true</filtering>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
</profile>
<!--dev and prod profiles follow this in a similar pattern -->
....
我正在使用 jasypt 1.9.1 版:
<dependency>
<groupId>org.jasypt</groupId>
<artifactId>jasypt-spring3</artifactId>
<version>1.9.1</version>
</dependency>
我在 /src/main/resources 中有一个主数据库属性文件 (database.properties) 设置,它具有以下占位符属性:
database.url=${database.url}
database.username=${database.username}
database.password=${database.password}
database.dialect=${database.dialect}
database.driver=${database.driver}
database.show_sql=${database.show_sql}
database.bar=${database.bar}
然后这是我的本地属性文件,位于 /src/main/resources/properties/local/database.properties :
database.url=jdbc:hsqldb:hsql://localhost/db
database.username=sa
database.password=
database.dialect=MyHSQLDialect
database.driver=org.hsqldb.jdbcDriver
database.show_sql=true
database.bar=ENC(RSuprdBgcpdheiWX0hJ45Q==)
这是我的示例 spring bean 代码,只需读取为其设置的属性。如果一切正常,该值将被打印到解密后的标准输出。
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class DummyPropertyTest {
private String prop;
public String getProp() {
return prop;
}
public void setProp(String prop) {
this.prop = prop;
}
@Value("#{dbProps['database.bar']}")
public String otherProp;
public String getOtherProp() {
return otherProp;
}
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("/META-INF/spring/applicationContext-common.xml");
DummyPropertyTest dpt = (DummyPropertyTest) ctx.getBean("dummy");
System.out.println("what's my property being set??: "+dpt.getProp());
System.out.println("otherProp:"+dpt.getOtherProp());
}
}
如果我调整我的 spring 配置以读取驻留在主属性文件上的属性,该文件通常只包含每个属性环境覆盖的占位符,然后解密工作。但是尝试从本地属性文件中读取加密属性时,解密不起作用。我一直在尝试调整弹簧配置,希望这可能只是一个类路径问题,但这似乎也无济于事。
我是否需要覆盖 Spring 如何查看属性前缀和后缀,如果只是为了可能需要加密的属性?(如果我这样做,这似乎适用于所有属性,而不仅仅是可加密的属性,因为 Jasypt 的 EncryptablePropertyPlaceholderConfigurer 是 Spring 的 PropertyPlaceholderConfigurer 的直接替代品)。
如果我按照我的说明设置了两个属性文件,这是程序的输出:
what's my property being set??: ENC(RSuprdBgcpdheiWX0hJ45Q==)
如果我的主属性文件包含加密属性,这是程序的输出:
what's my property being set??: sa
我不确定问题是Spring还是Jayspt。我不认为这是马文。如果可能的话,我宁愿不放弃现在的 Maven 配置文件。
为清晰起见,运行时示例进行了编辑。
*更新* : 如果我使用 Jasypt Spring 配置方式,我可以验证该值是否正确解密
<encryption:encryptable-properties id="dbProps" encryptor="jvmConfigurationEncryptor" location="classpath:database.properties"/>
然后在我的测试 Bean 中,我可以连接一个成员以将属性分配给它:
@Value("#{dbProps['database.bar']}")
public String otherProp;
这似乎有效。但我真的需要 PropertyOverride 工作,这样我才能正确地搞定数据库配置。