gpt4 book ai didi

java - jasypt ZeroSaltGenerator在Spring + Hibernate中生成不同的加密字符串

转载 作者:行者123 更新时间:2023-11-30 10:48:01 26 4
gpt4 key购买 nike

在我们基于 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 (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=

关于网络应用程序中哪里可能出错的任何提示?

编辑#1通过在带有附加源的 Eclipse 中进行调试进一步调查后,尽管在 xml 中配置了 ZeroSaltGenerator,但每次都会调用 RandomSaltGenerator 的 generateSalt() 方法。无法理解为什么应该调用它而不是 ZeroSaltGenerator 中的方法。

最佳答案

经过大量调试,我发现无论xml中的bean配置如何,盐生成器始终是RandomSaltGenerator。

还有另一个 EntityEncryptedStringType.class 具有相同的类型定义。但是它包含了直接指定密码,算法等的@Parameter注解,所以它没有引用第一个Entity使用的hibernateStringEncryptor >.

因此,它正在启动一个新的 StandardPBEStringEncryptor(默认情况下使用 RandomSaltGenerator),它也被已经实例化的 hibernateStringEncryptor.

一旦我将第二个 Entity 更新为与第一个具有相同的 typedef,它就会按预期工作。

乐于助人 ;)

关于java - jasypt ZeroSaltGenerator在Spring + Hibernate中生成不同的加密字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35982130/

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