使用Jasyp加密日期:密码未设置例外

时间:2015-03-09 16:39:40

标签: spring encryption jasypt

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

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

我在运行时通过Web表单输入全局密码。这个过程适用于字符串,但是当我尝试读/写日期时,我得到了例外:

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

我的package-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”)

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

1 个答案:

答案 0 :(得分:0)

经过无休止的调试后,问题的根源就变成了HibernatePBEStringEncryptor的初始化。

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

弹簧-beans.xml文件

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

初始化类:

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

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

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

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

修复错误的正确代码是:

this.strongEncryptor = hibernateStringEncryptor.getEncryptor();