Java MessageDigest不起作用

时间:2011-10-04 12:12:31

标签: java md5 digest

我无法使MessageDigest工作,该程序给了我两个错误: UnsupportedEncodingException,NoSuchAlgorithmException

 byte[] bytesOfchat_key = "lol".getBytes("UTF-8");
 MessageDigest md = MessageDigest.getInstance("MD5");
 byte[] Digest = md.digest(bytesOfchat_key);

如果我抛出错误,它会给我ワ￟ㅄ9ㅔヌnp> 0xd￉z作为回应(16个字符)

PS:我曾经打印过摘要

for (byte b : Digest) {
    System.out.print((char)b);
}

3 个答案:

答案 0 :(得分:4)

md5返回十六进制数字,因此要将其解码为String,您可以使用

String plaintext = "lol";
MessageDigest m = MessageDigest.getInstance("MD5");
m.reset();
m.update(plaintext.getBytes());
byte[] digest = m.digest();
//Decoding
BigInteger bigInt = new BigInteger(1,digest);
String hashtext = bigInt.toString(16);
while(hashtext.length() < 32 ){
  hashtext = "0"+hashtext;
}

答案 1 :(得分:1)

程序没有给你你那些错误 - 你正在调用可以抛出这些异常的方法,所以你需要为它们捕获块,或者声明你的方法也抛出它们。

摘要的结果是二进制数据,而不是文本。您应该将其逐字节转换为这样的文本 - 如果您需要它作为字符串,有两种常见的解决方案:

  • 将每个字节编码为一对十六进制数字
  • 在完整字节数组
  • 上使用Base64编码

每个都可以使用Apache Commons Codec轻松实现。

MessageDigest没有任何问题,但我相信你对异常的工作原理有一个错误的理解,以及如何以与文本数据不同的方式处理二进制数据。

答案 2 :(得分:1)

MessageDigest生成的字节不一定代表可打印的字符。您应该显示每个字节的数值,或者将字节数组转换为Base64字符串以使其具有可打印的内容。

请参阅apache commons-codec以获得Base64的实现。

您必须永远不会发生两个例外情况,因为任何JVM都支持UTF-8,JVM本身也支持MD5算法。因此,您应该将代码包装在try catch块中,如下所示:

try {
    byte[] bytesOfchat_key = "lol".getBytes("UTF-8");
    MessageDigest md = MessageDigest.getInstance("MD5");
    byte[] Digest = md.digest(bytesOfchat_key);
}
catch (NoSuchAlgorithmException e) {
    throw new RuntimeException("something impossible just happened", e);
}
catch (UnsupportedEncodingException e) {
    throw new RuntimeException("something impossible just happened", e);
}