我无法使MessageDigest工作,该程序给了我两个错误: UnsupportedEncodingException,NoSuchAlgorithmException
byte[] bytesOfchat_key = "lol".getBytes("UTF-8");
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] Digest = md.digest(bytesOfchat_key);
如果我抛出错误,它会给我ワㅄ9ㅔヌnp> 0xdz作为回应(16个字符)
PS:我曾经打印过摘要
for (byte b : Digest) {
System.out.print((char)b);
}
答案 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)
程序没有给你你那些错误 - 你正在调用可以抛出这些异常的方法,所以你需要为它们捕获块,或者声明你的方法也抛出它们。
摘要的结果是二进制数据,而不是文本。您应该不将其逐字节转换为这样的文本 - 如果您需要它作为字符串,有两种常见的解决方案:
每个都可以使用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);
}