【发布时间】:2016-03-14 07:54:13
【问题描述】:
在我们基于 Spring + hibernate 的 Web 应用程序中,我配置了 jasypt 来加密存储在数据库中的用户联系号码。它对加密工作正常,因为数据库包含加密字符串,并且值被解密并正确显示在 UI 上。问题是我们还需要在搜索查询的WHERE 子句中使用加密列。正如 SO 和其他论坛上的许多线程所建议的那样,解决方案是使用 ZeroSaltGenerator 以便盐不是随机的,并且加密字符串对于特定字符串始终相同。我的 bean 配置如下所示:
<bean id="hibernateStringEncryptor" class="org.jasypt.hibernate4.encryptor.HibernatePBEStringEncryptor">
<property name="registeredName" value="hibernateStringEncryptor" />
<property name="encryptor">
<ref bean="strongEncryptor" />
</property>
</bean>
<bean id="strongEncryptor" class="org.jasypt.encryption.pbe.StandardPBEStringEncryptor">
<property name="algorithm">
<value>PBEWithMD5AndTripleDES</value>
</property>
<property name="password">
<value>jasypt</value>
</property>
<property name="saltGenerator">
<bean class="org.jasypt.salt.ZeroSaltGenerator" />
</property>
</bean>
实体类包含以下typedef:
@TypeDef (name="encryptedString", typeClass= EncryptedStringType.class,
parameters = {
@Parameter(name="encryptorRegisteredName", value="hibernateStringEncryptor")
}
)
并且该列是这样注释的
@Column(name = "user_mobileno")
@Type(type="encryptedString")
private String userMobileNumber;
然而,结果是相同联系人号码的不同加密字符串。有趣的是,具有相同配置的独立 java 程序会按预期输出正确的结果
StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
encryptor.setAlgorithm("PBEWithMD5AndTripleDES");
encryptor.setPassword("jasypt");
SaltGenerator saltGenerator = new ZeroSaltGenerator();
encryptor.setSaltGenerator(saltGenerator);
System.out.println(encryptor.encrypt("hello"));
System.out.println(encryptor.encrypt("hello"));
O/P:
AvuVEQWIReI=
AvuVEQWIReI=
请提供任何关于这可能在 web 应用程序中出错的地方的提示?
编辑 #1 通过在 eclipse 中使用附加源进行调试进一步调查后,即使在 xml 中配置了 ZeroSaltGenerator,每次都会调用 RandomSaltGenerator 的 generateSalt() 方法。无法理解为什么应该调用它而不是 ZeroSaltGenerator 中的方法。
【问题讨论】:
标签: java hibernate spring-mvc encryption jasypt