【问题标题】:MD5 and Hibernate QueryMD5 和休眠查询
【发布时间】:2011-01-10 15:21:52
【问题描述】:
public Login authenticate(Login login) {
         String query = "SELECT L FROM Login AS L WHERE L.email=? AND L.password=?";
         Object[] parameters = { login.getEmail(), login.getPassword() };
         List<Login> resultsList = (getHibernateTemplate().find(query,parameters));
         if (resultsList.isEmpty()) {
             //error dude
         }
         else if (resultsList.size() > 1) {
             //throw expections
         }
         else {
           Login login1 = (Login) resultsList.get(0);
           return login1;
         }       
       return null;  
    }

我的 DB 表密码 col 设置为 MD5,现在如何在这里找回它。

【问题讨论】:

    标签: java hibernate passwords


    【解决方案1】:

    您必须对密码进行哈希处理并将哈希值作为参数传递。比如:

    String hash = hash(login.getPassword());
    Object[] parameters = { login.getEmail(), hash };
    

    有关如何实现hash(..) 方法,请参阅this question。但是,请避免使用 MD5。请改用 SHA。

    【讨论】:

    • 你可以隐藏我的方法并使用 SHA 显示它,因为我无法从帖子中弄清楚。哪个类包含哈希方法
    • 没有这样的算法,当我尝试 MessageDigest md = MessageDigest.getInstance("SHA-256");
    • 在这里工作正常。你的环境在某种程度上是错误的。或者你打错了。
    • 你也可以考虑加盐。您使用的是什么版本的 Java?如果您的版本较旧(1.4 或更早)或者您没有使用 Sun 的 JRE,它可能不支持 SHA-256,您可能需要外部安全提供程序,例如 Bouncy Castle。 OWASP 在这里有一个 Java 凭证检查和存储的问题; owasp.org/index.php/Hashing_Java
    【解决方案2】:

    我相信您希望在调用身份验证之前将您的 L.password 转换为 md5

    this useful link

    import java.security.*;
    
    ..
    
    byte[] bytesOfMessage = yourString.getBytes("UTF-8");
    
    MessageDigest md = MessageDigest.getInstance("MD5");
    byte[] thedigest = md.digest(bytesOfMessage);
    

    【讨论】:

    • 你可以隐藏我的方法并使用 SHA 显示它,因为我无法从帖子中弄清楚。哪个类包含哈希方法
    • @theJava:Bozho 在他的回答评论中有一个很好的链接。尝试使用stackoverflow.com/questions/3103652/… 答案。
    猜你喜欢
    • 2011-08-09
    • 2011-02-16
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    相关资源
    最近更新 更多