如何将MD5哈希变为字符串?

时间:2012-11-10 14:37:58

标签: java eclipse algorithm md5

我想将MD5哈希变为字符串:

public String MD5ToString(String plain) {
    try {
        MessageDigest md = MessageDigest.getInstance("MD5");
        md.reset();
        md.update(plain.getBytes());
        byte[] digest = md.digest();
        BigInteger bigInt = new BigInteger(1,digest);
        String hashtext = bigInt.toString(16);
        // Now we need to zero pad it if you actually want the full 32 chars.
        while(hashtext.length() < 32 ){
            hashtext = "0"+hashtext;
        }
        return plain;
    } catch (Exception e) {
        System.out.println("Cannot encrypt String to Hash");
        e.printStackTrace();
    }
    return null;
}

然而我只是让Md5回来了?什么是ms错误?

更新

我将返回类型更改为hashtext,但是当我想将一个哈希值转换为一个字符串时,我只是让另一个返回:

String: test
Hash: 098f6bcd4621d373cade4e832627b4f6
String: fb469d7ef430b0baf0cab6c436e70375

3 个答案:

答案 0 :(得分:5)

我没有仔细分析代码,但是你返回了没有改变的对象plain。如果要从方法返回MD5字符串,则应返回hashText对象。

答案 1 :(得分:3)

要拥有一个可以轻松发送或存储的可用字符串,通常的解决方案是将其编码为base64(它比hexa短约33%)。

这是Google可以找到的众多教程之一:http://www.javatips.net/blog/2011/08/how-to-encode-and-decode-in-base64-using-java

在您的确切情况下,您似乎想要hexa表示,也许您只想更改

return plain;

return hashtext;

答案 2 :(得分:1)

  

我将返回类型更改为hashtext,但是当我想将哈希值转换为字符串时,我只是得到另一个哈希值。

你似乎对哈希是什么感到误解。

  • 通常,散列是一种不可逆转换。您将哈希值转换回原始字符串/对象/任何内容的副本...因为原始的大部分/大部分信息内容已被丢弃。实际上,有无数个可能的输入字符串散列到给定的散列值,并且无法知道哪一个是正确的。 (他们所有正确。)

  • 在像MD5这样的加密哈希函数的情况下,情况更糟。这些功能专门设计为不可逆。或者更确切地说,它们的设计使得对于给定的散列,恢复可能的输入的问题在计算上是难以处理的。

现在碰巧MD5很弱......而且如果你有大量(但在技术上可行)数量的计算资源和时间,则可以反转哈希。但是,这并没有解决第一个要点。


最重要的是,如果您希望能够恢复原始字符串,则需要加密它而不是哈希。