Java消息摘要[MD5]未产生预期的哈希值

时间:2013-11-12 13:57:36

标签: java md5 message-digest

我正在尝试使用以下代码生成MD5十六进制哈希:

String password = "password";

MessageDigest digest = MessageDigest.getInstance("MD5");

ByteArrayInputStream bais = new ByteArrayInputStream(password.getBytes());

int size = 16;
byte[] bytes = new byte[size];
while ((bais.read(bytes, 0, size)) != -1)
{
  digest.update(bytes);
}

byte[] hash = digest.digest();
StringBuilder sb = new StringBuilder(2 * hash.length);
for (byte b : hash)
{
  sb.append(String.format("%02x", b & 0xff));
}

System.out.println("MD5:/ " + sb.toString());

输出应为5f4dcc3b5aa765d61d8327deb882cf99(与md5sum一起检查),但我无法看到错误的位置。我做错了什么?

3 个答案:

答案 0 :(得分:2)

我不知道你的问题是什么,但这应该有效:

byte[] array = MessageDigest.getInstance("MD5").digest("password".getBytes("UTF-8"));              
StringBuffer sb = new StringBuffer();
for (int i = 0; i < array.length; ++i) {
    sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).substring(1, 3));            
}
System.out.println(sb.toString());

答案 1 :(得分:1)

您应该只更新部分读取字节:

    int len;
    byte[] bytes = new byte[size];
    while ((len = bais.read(bytes, 0, size)) != -1)
    {
        digest.update(bytes, 0, len);
    }

答案 2 :(得分:1)

即使密码较短,您也总是将完整的bytes数组(16个字节)放入摘要中。

顺便说一下。整个构造与流是没有必要的,你可以简单地做:

byte[] hash = digest.digest(password.getBytes("UTF-8"));