Java JPA:如何使用SHA1加密持久化列?

Java JPA:如何使用SHA1加密持久化列?,java,jpa,jpql,Java,Jpa,Jpql,我对JPA(以及扩展的JPQL)相当陌生。希望有人能用这个问题来启发我 我正在尝试执行的查询 String query = "select u from user u where u.email = '" + userEmail + "' and u.password = sha1('"+ userPassword + "')"; List resultList = emf.createEntityManager().createQuery(query).getResultList(); 我得

我对JPA(以及扩展的JPQL)相当陌生。希望有人能用这个问题来启发我

我正在尝试执行的查询

String query = "select u from user u where u.email = '" + userEmail + "' and u.password = sha1('"+ userPassword + "')";
List resultList = emf.createEntityManager().createQuery(query).getResultList();
我得到了以下例外

Caused by: Exception [EclipseLink-8025] (Eclipse Persistence Services - 2.2.0.v20110202-r8913): org.eclipse.persistence.exceptions.JPQLException
Exception Description: Syntax error parsing the query [select u from Utilisateur u where u.email = 'myuser' and u.mot_Passe = sha1('mypassword')], line 1, column 73: unexpected token [(].
Internal Exception: NoViableAltException(83@[()* loopback of 383:9: (d= DOT right= attribute )*])
    at org.eclipse.persistence.exceptions.JPQLException.unexpectedToken(JPQLException.java:372)
...

很明显,我在这里遗漏了一些东西,我应该以某种方式逃离这个角色吗?用另一种方式指定它?我将非常感谢您在这方面提供的帮助。

通过查询接口设置参数,而不是直接将它们添加到JPQL字符串中。这样,您也可以保护自己免受:


通过查询接口设置参数,而不是直接将其添加到JPQL字符串中。这样,您也可以保护自己免受:


我认为JPA没有sha1函数。所以你有两个选择:

  • 您可以在Java代码上实现sha1函数,并在加载查询中的参数之前使用它们

    String query = "select u from user u where u.email = :userEmail" +
       " and u.password = :userPassword";
    Query jpqlQuery = em.createQuery(query)
        .setParameter("userEmail", userEmail)
        .setParameter("userPassword",sha1(userPassword));
    
  • 如果数据库具有sha1函数,则可以编写本机查询。检查此链接:

    List customers=(List)em.createNativeQuery
    (“从客户中选择*”,jpql示例.entities.Customer.class)
    .getResultList();
    迭代器i=customers.Iterator();
    客户客户;
    while(i.hasNext()){
    cust=(客户)i.next();
    //做点什么
    }
    

  • 我认为JPA没有sha1函数。所以你有两个选择:

  • 您可以在Java代码上实现sha1函数,并在加载查询中的参数之前使用它们

    String query = "select u from user u where u.email = :userEmail" +
       " and u.password = :userPassword";
    Query jpqlQuery = em.createQuery(query)
        .setParameter("userEmail", userEmail)
        .setParameter("userPassword",sha1(userPassword));
    
  • 如果数据库具有sha1函数,则可以编写本机查询。检查此链接:

    List customers=(List)em.createNativeQuery
    (“从客户中选择*”,jpql示例.entities.Customer.class)
    .getResultList();
    迭代器i=customers.Iterator();
    客户客户;
    while(i.hasNext()){
    cust=(客户)i.next();
    //做点什么
    }
    

  • 在EclipseLink中,可以使用FUNC查询词来使用特定于数据库的函数

    “从用户u中选择u,其中u.email=:email,u.password=FUNC('sha1',:password)”

    看,,

    在EclipseLink中,您可以使用FUNC查询词来使用特定于数据库的函数

    “从用户u中选择u,其中u.email=:email,u.password=FUNC('sha1',:password)”

    看,,

    这将保护我免受SQL注入,我同意。但是,它并没有解决我的原始问题(仍然得到解析异常)。原因是:异常[EclipseLink-8025](Eclipse持久性服务-2.2.0.v20110202-r8913):org.Eclipse.Persistence.exceptions.JPQLException异常描述:解析查询时出现语法错误[从Usilizateur u中选择u,其中u.email=:userEmail和u.password=sha1(:userPassword)],第1行第76列:意外令牌[(]@WardFlores Uhm,JPA有sha1函数吗?因为?谢谢Sean,是的,你是对的,显然JPA不支持sha1函数。谢谢。这将保护我免受SQL注入,我同意。但是,这并不能解决我最初的问题(仍然得到解析异常)。原因:异常[EclipseLink-8025](Eclipse持久性服务-2.2.0.v20110202-r8913):org.Eclipse.Persistence.exceptions.JPQLException异常描述:语法错误解析查询[从Usilisateur u中选择u,其中u.email=:userEmail和u.password=sha1(:userPassword)],第1行,第76列:意外令牌[(]@WardFlores Uhm,JPA有sha1函数吗?谢谢Sean,是的,你是对的,显然JPA不支持sha1函数。谢谢。正如S.P.F所说,你需要在Java代码中计算sha1,然后将其设置为查询的密码参数。正如S.P.F所说,你需要在Java代码中计算sha1,然后将其设置为查询的密码参数。看起来JPA不支持加密哈希函数。感谢您对这些替代方案的建议。在Java上实现sha1函数成功了。非常感谢。看起来JPA不支持加密哈希函数。感谢您对这些替代方案的建议。在Java上实现sha1函数成功了。谢谢太多了。
    List<Customer> customers = (List<Customer>)em.createNativeQuery
            ("SELECT * FROM customers", jpqlexample.entities.Customer.class)
                          .getResultList(); 
    Iterator i = customers.iterator();
    Customer cust;
    while (i.hasNext()) {
        cust = (Customer) i.next();
        //do something
    }