Java 和 php5 MD5 哈希之间的区别
我面临着一个奇怪的问题,它与 Java 和 php5 中的 MD5 哈希相关。 我认为在某些情况下以下代码不会 生成正确的 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 哈希值。
有什么想法以上有什么问题吗?
I'm facing kind of a strange issue which is related MD5-Hashes in Java and php5.
I figured that unter certain circumstances the following code does not
generate correct MD5 hashes:
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();
}
I had to migrate an existing user database where the passwords where stored
in php5 MD5. Now some of the users, not all, can't login because my Java code
does not produce the correct MD5 hash.
Any ideas what's wrong with the above?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
byteArrToHexString
无法正确转换 <0x10 的字节,您需要用零填充它们。例子:
byteArrToHexString
does not convert bytes <0x10 correctly, you need to pad them with zeros.Example:
太有趣了...我自己刚刚遇到了 MD5 哈希密码的问题。 我的例子中的问题是将原始密码编码为
byte[]
。我建议您确切地找出之前使用哪种编码来哈希密码,并将上面代码的第6行更改为
(当然,这只是一个示例......找出正确的字符集用作参数)
顺便说一句,我想你有你的理由,但为什么不让哈希方法这样做呢?
尤瓦尔=8-)
So funny... I just encountered a problem with MD5 hashed passwords myself. The problem in my case was the encoding of the original password into a
byte[]
.I advise you to find out exactly which encoding was used to hash the passwords previously, and change line 6 of the code above to
(Of course, this is just an example... find out the correct Charset to use as a parameter)
BTW, I suppose you have your reasons, but why not have the hashing method do this?
Yuval =8-)
您缺少:
在执行 update() 之前
检查 Java带有 MessageDigest 的 md5 示例
You are missing:
before doing an update()
Check Java md5 example with MessageDigest
我找到了 2 个解决方案(从此处找到 和其他答案):
根据一些基准测试,我可以说
md5
函数比md5Hex
函数快大约两倍。 这是测试:gradle 文件有这样的内容:
I've found 2 solutions (found from here and from the other answers) :
According to some benchmarks, I can say that the
md5
function is about twice faster than themd5Hex
function. Here's the test:gradle file has this: