显示垃圾的JavaMD5哈希
我编写了一个简单的函数来将字符串转换为md5,我在输出中看到了奇怪的字母。我想一些字符编码是乱七八糟的。我能指出我做错了什么吗显示垃圾的JavaMD5哈希,java,encryption,md5,Java,Encryption,Md5,我编写了一个简单的函数来将字符串转换为md5,我在输出中看到了奇怪的字母。我想一些字符编码是乱七八糟的。我能指出我做错了什么吗 public class App { public static void main(String[] args){ String str = "helloWorldhelloWorldhelloWolrd"; getHash(str); } public static void getHash(String str){ try {
public class App
{
public static void main(String[] args){
String str = "helloWorldhelloWorldhelloWolrd";
getHash(str);
}
public static void getHash(String str){
try {
byte[] three = str.getBytes("UTF-8");
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] thedigest = md.digest(three);
String str1 = new String(thedigest,"UTF-8");
System.err.println(str1);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
输出:
这就是我所看到的
n?)?????fC?7
您需要将字节转换为十六进制字符串,而不是直接转换为字符串:
byte[] thedigest = md.digest(three);
StringBuilder buff = new StringBuilder();
for (byte b : theDigest) {
String conversion = Integer.toString(b & 0xFF,16);
while (conversion.length() < 2) {
conversion = "0" + conversion;
}
buff.append(conversion);
}
String str1 = buff.toString();
System.err.println(str1);
字节[]thedigest=md.digest(三个);
StringBuilder buff=新的StringBuilder();
for(字节b:最大值){
字符串转换=整数.toString(b&0xFF,16);
while(conversion.length()<2){
换算=“0”+换算;
}
buff.append(转换);
}
字符串str1=buff.toString();
系统错误打印项次(str1);
您不能将摘要显示为字符串(因为它只是垃圾),您需要以某种方式转换字节,以便以人类可读的形式显示它们。我建议使用Base64编码器
另一个线程正在讨论如何将MD5转换为字符串。FWIW,如果您可以使用第三方库,可以使用
Hashing.MD5().hashString(String,Charsets.UTF_8).toString()
,在一行程序中获得十六进制编码的MD5哈希。这完全行不通。您必须担心负字节,这意味着您必须执行b&0xFF
,然后您必须担心填充,因为有些字节将被编码为一个字符,没有前导零。这就是我使用的:final biginger bigInt=new biginger(1,md.digest());格式(“%032x”,bigInt)代码>@LouisWasserman负字节将采用两位补码格式否?通过您的更改,我看到此6e-6329-647f-7f-22-47-42-5210661143-3837Thx。杰森的评论也是如此。