Я использую jasypt hibernate encryptor (с ZeroSaltGenerator) в одном из моих весенних проектов.
Все работает нормально, но я застрял при использовании предложения like в моих HQL-запросах.
У меня есть рабочий HQL-запрос, подобный следующему:
List<ConsumerAddress> addressList = sessionFactory.createQuery(
"from ConsumerAddress where city like %:searchString%").setParameter("searchString",request.getSearchString).list();
Поле моего города теперь зашифровано в БД.Таким образом, вышеупомянутый запрос не дает никаких результатов для строки поиска "beng", даже если в моей БД есть записи (зашифрованные), такие как "bengaluru" и "bengal".Это очевидно, потому что зашифрованная строка «beng» не обязательно должна быть подстрокой зашифрованной строки «bengaluru» и «bengal».
Поэтому мой вопрос заключается в том, как я могу обрабатывать такие поисковые запросы для конфиденциальныхзашифрованные данные?
Я уже хорошо прочитал документацию на сайте jasypt , в которой упоминается
Но шифрование ограничивает использование Hibernate: стандарты безопасностиустановить, что две разные операции шифрования для одних и тех же данных не должны возвращать одно и то же значение (из-за использования случайной соли).Из-за этого ни одно из полей, которые устанавливаются для шифрования при сохранении, не может быть частью предложения WHERE в ваших поисковых запросах для объекта, которому они принадлежат.
Но это очень практичноСценарий, в котором многие чувствительные поля, такие как адрес потребителя, могут быть зашифрованы, но нам все равно, возможно, придется искать их на основе заданных подстрок.
Есть ли способ, которым я могу достичь этого? Я также пыталсяОграничения. Как и в критериях гибернации, но, как и ожидалось, это также не помогло.
Любые предложения приветствуются!
Вот мой 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
}
Иbean-компонент hibernateStringEncryptor определяется в сервлете следующим образом:
<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>