使用 Jasyp 加密日期:密码未设置异常

Encrypt dates with Jasyp: password not set exception

我在 spring 4.1.1 网络应用程序中使用 jasypt-1.9.2.jar。

我有必要对数据库中的日期和字符串进行加密。

我在运行时通过 Web 表单输入全局密码。该过程适用于字符串,但是当我尝试 read/write 一个日期时,出现异常:

org.jasypt.exceptions.EncryptionInitializationException: Password not set for Password Based Encryptor

我的包-info.class与涉及的实体bean在同一个包中:

/**
 * Declaring system wide encrypted DataBase columns
 */
@TypeDefs({
    @TypeDef(
        name="encryptedString",
        typeClass = EncryptedStringType.class,
        parameters = {
            @Parameter(name="encryptorRegisteredName", value="strongHibernateStringEncryptor")
        }
    ),
    @TypeDef(
        name="encryptedDate",
        typeClass = EncryptedDateAsStringType.class,
        parameters = {
            @Parameter(name="encryptorRegisteredName", value="strongHibernateStringEncryptor")
        }
    )
})

@FilterDefs({
    @FilterDef(name = "filterIgnoreCancelled", defaultCondition = "billing_status != :billing_status_param", parameters = { @ParamDef(name = "billing_status_param", type = "string") })
})

package com.synaptic.db.beans;
import org.hibernate.annotations.FilterDef;
import org.hibernate.annotations.FilterDefs;
import org.hibernate.annotations.ParamDef;
import org.hibernate.annotations.Parameter;
import org.hibernate.annotations.TypeDef;
import org.hibernate.annotations.TypeDefs;
import org.jasypt.hibernate4.type.EncryptedDateAsStringType;
import org.jasypt.hibernate4.type.EncryptedStringType;

我用注释声明加密字段: @Type(类型="encryptedDate") 或者 @Type(类型="encryptedString")

知道我做错了什么吗?它非常适合字符串,但我得到了日期的例外。

经过无休止的调试,问题的根源最终归结为 HibernatePBEStringEncryptor 初始化。

在我的代码中,我使用以下行来初始化加密器:

spring-beans.xml

<bean id="hibernateStringEncryptor" class="org.jasypt.hibernate4.encryptor.HibernatePBEStringEncryptor">
    <property name="registeredName" value="strongHibernateStringEncryptor" />
    <!-- <property name="encryptor" ref="strongEncryptor" /> -->
</bean>

初始化class:

@Autowired
public GlobalPasswordManagerImpl(HibernatePBEStringEncryptor hibernateStringEncryptor,...
    this.strongEncryptor = createNewEncryptor();

    this.hibernateStringEncryptor = hibernateStringEncryptor;
    this.hibernateStringEncryptor.setEncryptor(this.strongEncryptor);

但是 HibernatePBEStringEncryptor 已经创建了它自己的 StandardPBEStringEncryptor,所以我最终覆盖了现有的。

出于某些原因,我无法解释我的某些实体最终使用原始加密器而不是我创建的加密器,并且由于原始加密器从未正确初始化,它抛出异常。

修复错误的正确代码是:

this.strongEncryptor = hibernateStringEncryptor.getEncryptor();