【问题标题】:How to use hash function in java for hashing the password?如何在java中使用哈希函数对密码进行哈希处理?
【发布时间】:2011-03-15 03:46:27
【问题描述】:

我正在尝试对密码进行哈希处理并将其保存在数据库中;我知道散列是一种单向过程。如何检查用户提供的密码和存储在数据库中的密码是否相同?我正在使用 MD5,并且每次执行散列时都会为相同的输入获得不同的值。有人可以帮忙吗?

String pass = "wor1ldcup";
    String pass1 = "wor1ldcup";

    DigestUtils du = new DigestUtils();
    byte[] b = du.md5(pass);
    byte[] b1 = du.md5(pass1);

【问题讨论】:

  • 您能否提供一个错误代码示例,用于从同一输入生成不同的 md5 值?
  • 我可以散列值,但我不知道如何再次使用该值进行比较
  • /同意亚尼克的观点。如果您正确使用 MD5,除非输入更改,否则它不会更改。这就是为什么它被如此多地用于验证(并不是说它不可能破坏它,因为它是,但是......)
  • 这不是骗子,我可以散列字符串但不知道如何使用散列值。请正确阅读问题。

标签: java


【解决方案1】:

您提供的代码基本正确,但有几点需要注意:

  1. DigestUtils 的方法都是static,因此应该被调用为:

    byte[] b = DigestUtils.md5(...);
    

    而不是像

    DigestUtils du = new DigestUtils();  // wrong ... no need to instantiate
    byte[] b = du.md5(...);              // wrong ... never use an instance to
                                         //           call a static method.
    
  2. 您没有展示如何比较 bb1,但 b == b1 将不起作用,b.equals(b2) 也不会...两者都比较参考。您需要致电Arrays.equals(b, b1)

  3. 尝试将 MD5 哈希转换为字符串是一个坏主意。根据默认字符集,转换结果可能是有损的;即不可逆。如果要在数据库中存储 MD5 哈希,最好使用(例如)base64 编码将其编码为字符串,并保存编码后的哈希。

【讨论】:

  • +1 表示“坏主意”。散列数据应始终被视为不透明的 blob,只有在绝对必要时才应将其转换为 String。加密数据也是如此。
  • 非常感谢你如果你有任何关于散列的教程请发布它...你提到了字符集转换和base64编码我不知道请帮忙
【解决方案2】:

您确实应该使用 bcrypt 而不是 MD5 来存储密码。 Here is an article on why(还有很多)。

jBcrypt library 运行良好。

【讨论】:

  • +1 我的第一个想法,我打算发表评论...也就是说你的答案应该是评论,而不是答案。
【解决方案3】:

用途:

import java.security.*;

byte[] password;
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
messageDigest.update(password, 0, password.length);
byte[] passwordHashed = messageDigest.digest();

需要将String 转换为byte[]byte[] 转换为十六进制或Base64 String

【讨论】:

    【解决方案4】:

    这里有几件事要检查:

    • 您是否在比较相同情况下的哈希值?即,在两个版本中,哈希中的字母数字都是小写的吗?
    • 是否有可能从其中一个哈希的前面截断了前导 0?
    • 您是否使用 == 比较两个字符串?请改用 .equals。

    如果所有这些都正常,那么对于完全相同的输入,哈希每次都应该返回相同的值。

    【讨论】:

    • 查看上面的代码如果我打印 b 和 b1 它显示不同的值。
    • 啊,没看到代码。哦,好吧,斯蒂芬的回答对我来说看起来不错。
    【解决方案5】:

    在最基本的层面上,当对密码使用散列函数时,您会在最初存储密码时散列密码,然后散列任何与原始密码匹配的尝试。

    因此,当您尝试验证现有用户的密码时,您的基本查询将使用提交密码的散列版本作为参数。

    SELECT * FROM Users where ID = 1234 and Password = @Password
    

    将@Password 绑定到 du.md5(submittedPassword)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-06
      • 2016-01-10
      • 2010-10-16
      • 1970-01-01
      • 2014-01-10
      • 1970-01-01
      相关资源
      最近更新 更多