在Jasypt休眠加密中将HQL查询与like子句一起使用

时间:2019-02-13 11:18:01

标签: java hibernate encryption hql jasypt

我在我的一个春季项目中使用jasypt休眠加密器(与ZeroSaltGenerator)。

一切都很好,但是我在HQL查询中只能使用'like'子句。

我有一个有效的HQL查询,如下所示:

List<ConsumerAddress> addressList = sessionFactory.createQuery(
"from ConsumerAddress where city like %:searchString%").setParameter("searchString",request.getSearchString).list();

我的城市字段现已在数据库中加密。因此,即使我的数据库具有“ bengaluru”和“ bengal”之类的条目(已加密),上述查询也无法给出搜索字符串“ beng”的任何结果。很明显,因为“ beng”的加密字符串不需要是“ bengaluru”和“ bengal”的加密字符串的子字符串。

所以我的问题是如何处理此类针对敏感加密数据的搜索查询?

我已经很好地阅读了jasypt site中提到的文档

  

但是加密设置了Hibernate使用的限制:安全性   标准规定,在   相同的数据不应返回相同的值(由于使用了随机数   盐)。因此,没有一个字段被设置为   持久化时加密可以成为您的WHERE子句的一部分   搜索它们所属的实体。

但这是一个非常实用的方案,其中许多敏感字段(例如消费者地址)可能会被加密,但我们可能仍必须根据给定的子字符串在它们之间进行搜索。

有什么办法可以实现这一目标?我也尝试过Restrictions。就像在休眠标准中一样,但按预期也没有帮助。

欢迎提出任何建议!

这是我的POJO供参考:

//required imports

@TypeDef(name = "encryptedString", typeClass = EncryptedStringType.class, parameters = {
               @Parameter(name = "encryptorRegisteredName", value = "hibernateStringEncryptor") })
@Entity
@Table(name="consumer_address")
public class ConsumerAddress {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="consumer_address_id")
    private Long consumerAddressId;

    @Column(name="address_line_1")
    @Type(type = "encryptedString")
    private String addressLineOne;

    @Column(name="address_line_2")
    @Type(type = "encryptedString")
    private String addressLineTwo;

    @Column(name="city")
    @Type(type = "encryptedString")
    private String city;

    @Column(name="state")
    @Type(type = "encryptedString")
    private String state;

    @Column(name="consumer_user_id")
    private Long consumerUserId;

    //required getters and setters  
}

hibernateStringEncryptor bean在servlet中的定义如下:

<bean id="strongEncryptor"
        class="org.jasypt.encryption.pbe.PooledPBEStringEncryptor">
        <property name="algorithm">
            <value>PBEWithMD5AndTripleDES</value>
        </property>
        <property name="password">
            <value>${db.encryption.password}</value>
        </property>
        <property name="poolSize">
            <value>${db.encryption.pool.size}</value>
        </property>
        <property name="saltGenerator">
            <bean class="org.jasypt.salt.ZeroSaltGenerator" />
        </property>
    </bean>

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

0 个答案:

没有答案