Java MessageDigest不起作用

我无法使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:我曾经打印过Digest

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

md5返回hex数,因此将其解码为您可以使用的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; } 

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

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

  • 将每个字节编码为一对hex数字
  • 在完整的字节数组上使用Base64编码

使用Apache Commons Codec可以轻松实现这些function。

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

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); }