【问题标题】:Java MD5 hashing function giving incorrect hashJava MD5 散列函数给出不正确的散列
【发布时间】:2014-03-17 13:09:50
【问题描述】:

我遇到了 Java md5 散列函数没有返回正确值的问题。对于大多数值,它确实返回了正确的值,但是我发现了一个输入不正确的示例。

我的代码是:

public String hash(String pass) throws Exception
{
    encr = MessageDigest.getInstance("MD5");
    return new BigInteger(1, encr.digest(pass.getBytes())).toString(16);
}

这会返回我尝试过的大多数示例的正确答案,例如 hash("beep") -> "1284e53a168a5ad955485a7c83b10de0"、hash("hello") -> "5d41402abc4b2a76b9719d911017c592" 等...

然后问题来了:hash("dog") -> "6d80eb0c50b49a509b49f2424e8c805" 而不是 "06d80eb0c50b49a509b49f2424e8c805",我从几个在线 md5 生成器以及 psql md5 生成器(我的 cod 正在与之交互)获得。

我非常感谢任何人都可以对此有所了解, 谢谢。

【问题讨论】:

  • 对您的问题一无所知,但 google guava 也有哈希函数。 code.google.com/p/guava-libraries/wiki/HashingExplained
  • 不知道谷歌番石榴,但一个哈希有一个 0 前缀,另一个没有。问题是使用new BigInteger(..).toString(16) 的十六进制编码,而不是哈希生成。
  • 另外,您使用.getBytes()。不要那样做:编码依赖于 JVM。请改用.getBytes("UTF-8")(如果您使用Java 7,请使用.getBytes(StandardCharsets.UTF_8))。

标签: java md5


【解决方案1】:

默认情况下它不包含前导零,但您可以自己轻松地填充这些:

String md5 = new BigInteger(1, encr.digest(pass.getBytes())).toString(16);
return String.format("%32s", md5).replace(' ', '0');

【讨论】:

  • 想写相同的答案,但你更快,做得好:)
  • 感谢您这么快回答我没有考虑到这一点。这样就解决了。
【解决方案2】:
// this code will resolve hashcode issue 
// I hope this helps everyone.

 private static String makeHash(String key_to_hash) {
            try {
                MessageDigest md = MessageDigest.getInstance("SHA1");
                md.reset();
                md.update(key_to_hash.getBytes(Charset.forName("UTF-8")));
                return bytesToHex(md.digest());
            } catch (Exception ex) {
                ex.printStackTrace();
            }
            return null;
        }



private static String bytesToHex(byte[] b) {
                char hexDigit[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
                        'a', 'b', 'c', 'd', 'e', 'f','A', 'B', 'C', 'D', 'E', 'F' };
                StringBuffer buf = new StringBuffer();
                for (int j = 0; j < b.length; j++) {
                    buf.append(hexDigit[(b[j] >> 4) & 0x0f]);
                    buf.append(hexDigit[b[j] & 0x0f]);
                }
                return buf.toString();
            }

【讨论】:

    猜你喜欢
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    • 2016-09-19
    • 2013-08-29
    相关资源
    最近更新 更多