Java MessageDigest doesn't work

假如想象 提交于 2019-12-03 21:05:52

md5 returns hexadecimal numbers, so for decoding it to a String you could use

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

The program doesn't give you those errors - you're calling methods which can throw those exceptions, so you need catch blocks for them, or declare that your method throws them too.

The result of a digest is binary data, not text. You should not convert it byte-by-byte to text like this - if you need it as a string, there are two common solutions:

  • Encode each byte as a pair of hex digits
  • Use Base64 encoding on the complete byte array

Each of these can be implemented easily with Apache Commons Codec.

There's nothing wrong with MessageDigest, but I believe you have a flawed understanding of how exceptions work, and how to treat binary data differently from text data.

The bytes generated by the MessageDigest don't necessarily represent printable chars. You should display the numeric value of each byte, or transform the byte array into a Base64 string to have something printable.

See apache commons-codec to get an implementation of Base64.

The two exception that you're forced to handle should never happen, because UTF-8 is guaranteed to be supported by any JVM, and the MD5 algorithm is also supported natively by the JVM. You shoud thus wrap your code inside a try catch block like this:

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);
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!