我编写了自己的AttributeConverter来加密和解密基于thoughts-on-java的ByteArrays,看起来类似于:
@Converter
public class CryptoByteArrayConverter implements AttributeConverter < Byte[], Byte[] > {
/**
* {@inheritDoc}
*/
@Override
public Byte[] convertToDatabaseColumn(Byte[] attribute) {
//...works fine
}
/**
* {@inheritDoc}
*/
@Override
public Byte[] convertToEntityAttribute(Byte[] dbData) {
//...works also fine
}
}
我的实体类正在使用此转换器:
@Entity
public class ArchivedInvoice implements Serializable {
//...
@Convert(converter=CryptoByteArrayConverter.class)
@JsonIgnore
private Byte[] encryptedXml;
//...
}
一切正常,直到这里。我设置的数据在数据库中加密,并在获得结果集后也被解密。 但CryptoByteArrayConverter不会自动在@Query中使用。 可以激活它还是有其他好的解决方法?
例如:
@Query("SELECT ai FROM #{#entityName} ai WHERE (ai.encryptedXml = :xml)")
Page < ArchivedInvoice > findByXml(@Param("xml") byte[] xml, Pageable p);
答案 0 :(得分:1)
我让它运行并意识到不需要检查解密的值是否相等。 DB属性的加密值与加密参数的比较会返回正确的结果。 将参数类型从byte []更改为Byte []后,AttributeConverter已自动激活并加密参数(xml):
@Query("SELECT ai FROM #{#entityName} ai WHERE (ai.encryptedXml = :xml)")
Page < ArchivedInvoice > findByXml(@Param("xml") Byte[] xml, Pageable p);
以下测试显示了我的意思:
@Test
public void saveTestEncryption() throws UnsupportedEncodingException {
repository.deleteAll();
ArchivedInvoice arcInv = createDTO(0);
repository.save(arcInv);
assertEquals(1, repository.count());
PageRequest pageRequest = new PageRequest(0, 25);
//Not encrypted!
String xml = arcInv.getXml();
Page < ArchivedInvoice > list =
repository.findByXml(ByteUtils.convert(xml.getBytes("UTF-8")), pageRequest);
assertEquals(1, list.getTotalElements());
xml += "A";
list = repository.findByXml(ByteUtils.convert(xml.getBytes("UTF-8")), pageRequest);
assertEquals(0, list.getTotalElements());
}