Java和php5 MD5 Hash之间的区别

我面临着一个奇怪的问题,它与Java和php5中的MD5-Hashes有关。 我认为,在某些情况下,以下代码不会生成正确的MD5哈希值:

public static String getMD5Hash(String string) { try { MessageDigest md5 = MessageDigest.getInstance("MD5"); md5.update(string.getBytes()); byte[] digest = md5.digest(); string = byteArrToHexString(digest); } catch (NoSuchAlgorithmException e1) { e1.printStackTrace(); } return string; } private static String byteArrToHexString(byte[] bArr) { StringBuffer sb = new StringBuffer(); for (int i = 0; i < bArr.length; i++) { int unsigned = bArr[i] & 0xff; sb.append(Integer.toHexString((unsigned))); } return sb.toString(); } 

我不得不迁移现有的用户数据库,其中密码存放在php5 MD5中。 现在,一些用户(不是所有用户)无法登录,因为我的Java代码没有生成正确的MD5哈希。

有什么想法上面有什么问题吗?

byteArrToHexString不能正确转换字节<0x10,您需要用零填充它们。

例:

 int unsigned = bArr[i] & 0xff; if (unsigned < 0x10) sb.append("0"); sb.append(Integer.toHexString((unsigned))); 

好笑……我刚刚遇到了MD5哈希密码问题。 我的问题是将原始密码编码为byte[]

我建议你确切地找出以前使用哪种编码来密码密码,并将上面代码的第6行更改为

 md5.update(string.getBytes("UTF-8")); 

(当然,这只是一个例子……找出正确的Charset用作参数)

顺便说一句,我想你有理由,但为什么不用散列方法呢?

 return new String(digest, "UTF-8"); 

Yuval = 8-)

你错过了:

 md5.reset(); 

在做更新之前()

使用MessageDigest检查Java md5示例