【问题标题】:How to turn a MD5 Hash to a String?如何将 MD5 哈希转换为字符串?
【发布时间】:2012-11-10 14:37:57
【问题描述】:

我想把一个 MD5 Hash 转成一个字符串:

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

【问题讨论】:

  • 一个 MD5 哈希是一个任意 16 字节的序列,你想把它转换成一个 32 十六进制字符的字符串......
  • 当您将此方法提供“098f6bcd4621d373cade4e832627b4f6”时,您的实际目标是获取字符串“test”吗?这通常是不可能的,散列不是您可以解密的加密。哈希函数的目标实际上是不可逆的。

标签: java eclipse algorithm md5


【解决方案1】:

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

【讨论】:

  • 然而我改变了返回类型,但是当我插入这个哈希(测试)098f6bcd4621d373cade4e832627b4f6 我只是得到另一个哈希......
  • 我回来了:fb469d7ef430b0baf0cab6c436e70375
【解决方案2】:

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

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

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

return plain;

return hashtext;

【讨论】:

    【解决方案3】:

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

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

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

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

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


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-27
      • 2011-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-21
      • 1970-01-01
      • 2020-12-05
      相关资源
      最近更新 更多