【问题标题】:java md5 hash showing garbagejava md5哈希显示垃圾
【发布时间】:2013-03-18 19:51:45
【问题描述】:

我编写了一个简单的函数来将字符串转换为 md5,我在输出中看到奇怪的字母。我假设某些字符编码搞砸了。我可以指出我做错了什么吗?

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

【问题讨论】:

  • FWIW,如果您可以使用第三方库,Guava 可以在 Hashing.md5().hashString(string, Charsets.UTF_8).toString() 的单行代码中为您提供十六进制编码的 MD5 哈希。

标签: java encryption md5


【解决方案1】:

您需要将字节转换为十六进制字符串,而不是直接转换为字符串:

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

【讨论】:

  • 这行不通。您必须担心负字节,这意味着您必须执行b &amp; 0xFF,然后您必须担心填充,因为某些字节将被编码为一个没有前导零的字符。
  • 这是我用的:final BigInteger bigInt = new BigInteger(1, md.digest()); String.format("%032x", bigInt);
  • @LouisWasserman 负字节将采用二进制补码格式吗?
  • 有了你的改变,我看到了这个 6e-6329-647f-7f-22-47-42-5210661143-3837
  • 谢谢。杰森的评论也是如此。
【解决方案2】:

您不能将摘要显示为字符串,(因为它只是垃圾)您需要以某种方式翻译字节,以便以人类可读的形式显示它们。我会提出一个 Base64 编码器。

还有另一个线程讨论如何将 MD5 转换为字符串 here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-08
    • 2014-05-19
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    相关资源
    最近更新 更多