我在我的一个春季项目中使用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>