2

我想将 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
4

3 回答 3

5

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

于 2012-11-10T14:40:19.273 回答
3

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

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

在您的确切情况下,您似乎想要六边形表示,也许您只是想改变

return plain;

return hashtext;
于 2012-11-10T14:40:07.603 回答
1

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

您似乎误解了哈希是什么。

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

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

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


底线是,如果您希望能够恢复原始字符串,则需要对其进行加密而不是对其进行哈希处理。

于 2012-11-10T23:52:59.257 回答