【问题标题】:jasypt ZeroSaltGenerator generates different encrypted strings in Spring + Hibernatejasypt ZeroSaltGenerator 在 Spring + Hibernate 中生成不同的加密字符串
【发布时间】: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


    【解决方案1】:

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

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

    因此,它启动了一个新的StandardPBEStringEncryptor(默认使用RandomSaltGenerator),它也被已经实例化的hibernateStringEncryptor引用。

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

    乐于助人;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-10
      • 1970-01-01
      • 2012-03-18
      • 2021-12-02
      相关资源
      最近更新 更多