【发布时间】:2012-11-02 05:21:09
【问题描述】:
我正在使用以下代码为我的应用程序生成 MD5 哈希,它编码一些字符串值,然后我通过我的 Web 服务将此生成的哈希发送到一些 .Net 代码,该代码读取我的 MD5 哈希并生成字符串的 MD5他从 DB 获取的字符串,然后比较它们
public static String getMD5Hash(String val) throws Exception {
byte[] bytes = val.getBytes();
MessageDigest m = MessageDigest.getInstance("MD5");
byte[] digest = m.digest(bytes);
String hash = new BigInteger(1, digest).toString(16);
System.out.println(hash.length());
return hash;
}
public static void main(String[] asd) throws Exception{
for(int i=0;i<10;i++){
System.out.println(getMD5Hash(i+Math.pow(10, i)+""));//for testing
System.out.println(getMD5Hash(i+""));//for testing
}
}
问题是,因为我从 BigInteger 获取转换后的哈希值,有时生成的哈希值以 0 开头,在这种情况下,Biginteger 不考虑 0,而另一方面,当 .Net 生成该哈希值时它使用 0 生成相同的字符串,这样字符串比较返回 false,例如
我生成并发送“102678D1922799CF9122B3F103975F1”的哈希码,其中 .Net 哈希为“0102678D1922799CF9122B3F103975F1”
有时它也会生成类似的代码
.Net generates 0012678D1922799CF9122B3F103975F1 and java 12678D1922799CF9122B3F103975F1
或
0002678D1922799CF9122B3F103975F1 and 2678D1922799CF9122B3F103975F1
我怎样才能得到这个开头全是 0 的代码。 提前致谢。
【问题讨论】:
-
使用 apache
Base64- 参考线程 - stackoverflow.com/questions/469695/decode-base64-data-in-java -
MD5的长度是固定的,所以你可以用零填充。
-
从您的问题来看,听起来您打算将其传递给另一个应用程序以“获取该字符串”。您不打算使用 MD5 作为密码吗?哈希算法是单程的。
-
您无法解码使用 MD5 散列的内容。正如 slashingweapon 所说,哈希是一种单向操作。