我想将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
答案 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很弱......而且如果你有大量(但在技术上可行)数量的计算资源和时间,则可以反转哈希。但是,这并没有解决第一个要点。
最重要的是,如果您希望能够恢复原始字符串,则需要加密它而不是哈希。