【问题标题】:JPA: Using AttributeConverter automatically decrypt in JPA queryJPA:在 JPA 查询中使用 AttributeConverter 自动解密
【发布时间】:2019-11-13 13:06:52
【问题描述】:

我编写了自己的 AttributeConverter 来加密和解密字符串,它类似于:

@Converter
public class CryptoConverter implements AttributeConverter<String, String> {

@Override
public String convertToDatabaseColumn(String attribute)  {
 //works fine
}

@Override
public String convertToEntityAttribute(String dbData) {
//works fine
}

}

我的实体类正在使用这个转换器:

@Entity
@PublishKeyword
@Table(name = "CARD")
@JsonIgnoreProperties(ignoreUnknown = true)
public class Card {

//...

@Column(name = "CARD_LAST_4_DIGITS")
@Convert(converter = CryptoConverter.class)
@Attribute(keyword = "CARD_CARDLAST4DIGITS", resolvedKeyword = "cardLast4Digits", length = 100)
private String cardLast4Digits;

//...
}

直到这里一切正常。我设置的数据在数据库中加密,得到结果集后也解密。但是 CryptoConverter 不会在 JPA 查询中自动使用。 ?

@Override
public Card findCard(String lastFour, String tenantId, EntityManager entityManager) {
    Query query = entityManager.createQuery("SELECT e FROM Card e where e.cardLast4Digits = :lastFour").setParameter("lastFour", "lastFour");
    List<Card> cardList = query.getResultList();
    if (cardList != null && cardList.size() > 0) {
        return cardList.get(0);
    }
    return null;
}

【问题讨论】:

  • 您希望转换器在什么意义上在查询中被“使用”?

标签: java jpa encryption cryptography aes


【解决方案1】:

输入也被转换。因此,如果您使用非对称加密(因此每次加密相同的值时会得到不同的输出),那么过滤将永远无法正常工作。

解决方案可以是使用对称加密或添加使用哈希的列(对于相同的值始终相同)并对其进行过滤。

【讨论】:

    猜你喜欢
    • 2021-01-19
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    • 2015-08-23
    • 2014-07-31
    • 2016-06-18
    • 2014-11-12
    相关资源
    最近更新 更多