【问题标题】:Using NamedQueries to query an encrypted column使用 NamedQueries 查询加密列
【发布时间】:2013-05-01 16:16:52
【问题描述】:

我有一个带有 JPA 的 java 应用程序,并且我正在使用 oracle DB。 实体的一个属性在保存到数据库之前需要加密。 我正在使用应用程序加密,Base64。 我有一个根据此属性搜索实体的命名查询。 现在由于加密,我需要首先加密来自应用程序的值并在数据库中搜索加密值,但查询找不到具有此值的实体。

具有加密值的命名查询是否存在问题? 有解决办法吗?

谢谢

【问题讨论】:

    标签: java database jpa encryption named-query


    【解决方案1】:

    两件事,Base64 是编码而不是加密,因此不是隐藏数据的安全方式。除非您在 base64 编码之前使用其他东西对其进行加密,否则您可能想要更改它。

    数据库不应该有问题,它应该像对待任何其他字符串一样对待它。虽然我之前在数据库字段长度小于存储加密字符串所需的长度时遇到过这个问题。

    手动检查数据库,以防在您插入密码时它被截断。还要在 SQL 客户端中运行测试以确保其行为异常,如果它在 SQL 客户端中运行,则您的应用程序未向数据库发送正确的值(或基于其他字段将其过滤掉)

    【讨论】:

    • 字段长度足够长,值不会被截断。当我在数据库中按原样执行查询时,这很好。问题出在命名查询上。
    • sql客户端发生了什么?
    • 这是命名查询 - @NamedQuery(name="Consumer.findConsumerByUsernameAndStatus", query="SELECT consumer FROM Consumer consumer WHERE consumer.status :status AND consumer.userName =:userName")
    • 和 find 方法 - public Consumer find(Object[] identifier,EntityManager entityManager) throws ModelException { try{ TypedQuery query=entityManager.createNamedQuery(NAMED_QUERY,Consumer.class); query.setParameter("userName",((String)convertIdentifier(identifier)).toLowerCase()); query.setParameter("status",Consumer.Status.RETIRED); query.setMaxResults(1);返回查询.getSingleResult(); }catch(NoResultException e){ //如果没有找到记录则返回null return null; } }
    • 而userName是加密的属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    • 2014-10-12
    • 1970-01-01
    • 2015-12-31
    • 1970-01-01
    相关资源
    最近更新 更多