【问题标题】:Difference between JPA's AttributeConverter and Hibernate's ColumnTransformer in terms of Encryption and Decryption of attributesJPA的AttributeConverter和Hibernate的ColumnTransformer在属性的加解密方面的区别
【发布时间】:2018-08-09 07:39:19
【问题描述】:

我有一个数据库,其中包含一些带有加密列的表。截至目前,所有这些列都是字符串类型。我正在使用 JPA 的 @Converter 来加密和解密表中的列。但是,我也知道,我可以使用 Hibernate 的@ColumnTransformer 在读写操作时达到相同的加密和解密目的。我的问题是它们有何不同,在速度、可维护性、未来增强等方面使用哪种方法更好?现在,@Converter 可以很好地处理字符串类型的数据。我不确定它是否适用于 Integer 类型,否则我将不得不创建一个新的 Converter 类。

【问题讨论】:

    标签: java hibernate jpa encryption


    【解决方案1】:

    它们非常相似,并且在许多情况下可以用于完全相同的事情,但解决方案的实现会有所不同。

    一个主要区别是一个是特定于 Hibernate 的,另一个是 JPA 规范的一部分。如果您想编写符合规范的代码,请使用@Converter,您将能够在您的代码中使用除 Hibernate 之外的其他实现。

    另一个主要区别是@ColumnTransformer 在数据库级别上运行,而@Converter 按原样从数据库中读取值,然后在应用程序端将其转换为其他内容。当数据库执行一些操作时,这可能会为@ColumnTransformer 提供性能优势。

    此外,您实际上可以为给定类型的所有值创建 AttributeConverterapplies automatically。例如,在您不想手动将@Converter 注释添加到许多地方的重构情况下,这可能是有利的。

    所以它们都可以用来执行类似的事情,并且没有一个隐含地比另一个更好

    【讨论】:

    • 哇,简洁明了!关于第二个区别(第 3 段),在查询具有“like”子句或某些模式匹配的情况下,@Converter 将如何工作?它会解密每一行和每一列然后进行模式匹配还是根本不起作用?我将使用的 JPA 查询将是这样的:“从 Person p where p.name like :name 中选择 p”。这里的“名称”列是 AES 加密的。
    • 出于性能和安全原因,您不希望基于加密列进行查询。我不相信这两种机制甚至可以使用加密列来处理这样的查询。如果您出于某种原因确实需要这种功能,则必须寻找最有可能包括完整数据库加密而不是单列加密的替代解决方案。
    • 感谢您提供的所有信息,这真的很有帮助。
    猜你喜欢
    • 1970-01-01
    • 2013-02-06
    • 2011-11-17
    • 2016-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-15
    相关资源
    最近更新 更多