Использование HQL-запросов с предложением like в hibernate-шифровании jasypt - PullRequest
0 голосов
/ 13 февраля 2019

Я использую 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>
...