【问题标题】:How to check user given password to md5 format password from database in java如何从java中的数据库检查用户给定的密码为md5格式密码
【发布时间】:2017-12-30 10:02:15
【问题描述】:

我在普通字符串中输入密码

public JobSeeker validateJobSeeker(String um, String pas) {

    System.out.println("in side jobseek valid dao");
    String hql= "select j from JobSeeker j where j.emailid=:u and j.password = COMPRESS(MD5(:pass))";

    List<JobSeeker> listofjobseeker = (List<JobSeeker>) sf.getCurrentSession()
        .createQuery(hql)
        .setParameter("u", um)
        .setParameter("pass", pas).list();
    return  ( listofjobseeker.size() > 0 ) ? listofjobseeker.get(0)  : null;
}

O/p = 列表 listofjobseeker = null。

这是我的桌子:

 select * from jobseeker;

id | confirmpassword  | emailid  | message | password | phoneno| username | usertype  | address_id |
 +----+----------------------------------+-----------------------+---------+-
    |  1 | 8337da1b34a7b4fec56bc0a418ca6e22 | xyz@gmail.com | NULL    | 
 8337da1b34a7b4fec56bc0a418ca6e22 | 123456 | Angad    | jobseeker |          1

我想验证用户是否登录。我将用户给定的密码转换为 md5 密码格式并在用户注册时存储到数据库中。当用户使用相同的 email_id 和密码登录时。我无法检查 md5 格式的密码给用户通过。

【问题讨论】:

  • 不要使用 md5 进行密码散列。它在 10 年前被黑客入侵,被认为是不安全的。如果您坚持不更改,只需使用普通密码即可,这提供了大致相同的安全性
  • 我知道,但它是用 md5 完成的。你能给我同样的解决方案吗?
  • 专业提示:在 Stack Overflow 上,读者欣赏使用真实英语单词精心撰写的帖子。请为 Facebook :-) 保存 txtspk。谢谢。

标签: spring hibernate hql md5


【解决方案1】:

您可以先将原始密码转换为 MD5 格式,然后再在数据库中进行匹配。像下面这样的方法应该会有所帮助。

private static String encode(String md5){
       try {
            java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
            byte[] array = md.digest(md5.getBytes());
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < array.length; ++i) {
              sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).substring(1,3));
           }
            return sb.toString();
        } catch (java.security.NoSuchAlgorithmException e) {
        }
        return null;

    }

你可以改变你的方法如下。

public JobSeeker validateJobSeeker(String um, String pas) {
  String encryptedPass = encode(pas);
  ...
  .setParameter("pass", encryptedPass).list();

}

【讨论】:

  • 感谢您的解决方案!!,我这样做了它的工作正常,但我想使用 hql 查询直接检查用户传递到 dbs 传递。有任何想法。
  • 您使用的数据库是什么?
  • MySql:服务器版本:5.7.19 MySQL 社区服务器(GPL)
  • 你可以在 SQLDeveloper 中试试这个 sql SELECT IF ((SELECT confirmpassword FROM JobSeeker WHERE emailid = :u) = MD5(:pass), 'true', 'false') AS valid。它应该可以正常工作。然后可以轻松地将其转换为 hql
  • 谢谢哥们!!它工作正常,但我使用 createSQLQuery 而不是 hql。 ,它返回字符串值,我们必须验证该字符串。
【解决方案2】:

我找到了我的问题的解决方案。我使用 SQLQUERY 而不是 SQL,因为我不知道 HQL 语法来匹配 md5 传递到用户传递:使用电子邮件验证用户和普通用户传递与 md5 加密传递进行比较。

让我们在下面结帐:

String hql =    "SELECT IF ((SELECT password FROM JobSeeker WHERE emailid = :u) = MD5(:pass), 'true', 'false') as r ";

        SQLQuery sql =    (SQLQuery) sf.getCurrentSession()
                                                                 .createSQLQuery(hql)
                                                                   .setParameter("u", um)
                                                                      .setParameter("pass", pas);

         sql.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
         Object validate = sql.uniqueResult();
         Map map = (Map) validate;
         System.out.println("inside sys.out.print is ========= " + map.get("r"));
         String val = (String) map.get("r");
         System.out.println("val is  = " + val);

         if(val.equals("true"))
         {
             List<JobSeeker> jobSeeker = (List<JobSeeker>) sf.getCurrentSession().createQuery("select j from JobSeeker j where j.emailid =:u ")
                                                          .setParameter("u", um).list();
             return (jobSeeker.size() > 0 ) ? jobSeeker.get(0) : null ;
         }
         else{  System.out.println("Invalid User , plz retry :( ");
             return null;
         }

    }  

【讨论】:

    猜你喜欢
    • 2020-09-05
    • 1970-01-01
    • 2019-01-24
    • 1970-01-01
    • 2010-12-12
    • 2011-02-01
    • 1970-01-01
    • 2018-04-16
    • 2011-05-24
    相关资源
    最近更新 更多