不同的JDK版本会生成不同的Java MessageDigest MD5哈希值吗?

9
我正在使用Java消息摘要创建MD5哈希,用于身份验证。该MD5哈希作为varchar2存储在数据库中。我在我的本地笔记本电脑上的Tomcat服务器上进行了测试以创建用户。当我将war文件部署到Linux Redhat上的测试Tomcat服务器上时,由于哈希不匹配,身份验证失败。我检查了用户名和密码:它们都是正确的。两个Web服务器指向同一数据库。
我怀疑在我的本地笔记本电脑上生成的哈希与测试服务器生成的哈希不同。我这样认为是否正确?
以下是我用来生成哈希的代码。
public static String getMD5Hash(String str) throws Exception
{
    MessageDigest md = MessageDigest.getInstance("MD5");

    md.update(str.getBytes());
    return new String(md.digest());
}

返回的字符串将被保存在以下定义的数据库表中

create table authen(
   passport varchar2(50),
   constraint pk_au primary key (passport) USING INDEX TABLESPACE xxxxxxx
);

这是我的笔记本电脑上的Java版本输出。
C:\Users\XXXX>java -version
java version "1.6.0_25"
Java(TM) SE Runtime Environment (build 1.6.0_25-b06)
Java HotSpot(TM) Client VM (build 20.0-b11, mixed mode, sharing)

这是在 RedHat 服务器上的 Java 版本输出

[xxxxxx@xxxxxxxxx ~]$ java -version
java version "1.6.0_20"
Java(TM) SE Runtime Environment (build 1.6.0_20-b02)
Java HotSpot(TM) Client VM (build 16.3-b01, mixed mode, sharing)

我怀疑在我的本地电脑上生成的哈希值与测试服务器上生成的不同。我是对的吗?不,你不是。 - bestsss
如果确实不同,那么这将是实现中的一个重要错误。展示你的代码,然后我们可以帮助你找到原因。 - Paŭlo Ebermann
3个回答

7

你可能正在使用默认字符集生成要传递到 MD5.digest() 方法中的字节,并且该字符集在您的笔记本电脑和服务器之间不同。

这可能是您看到不同结果的原因。否则,它不可能生成不同的结果。

例如 --

byte[] bytesOfMessage = tempStr.getBytes("UTF-8"); // Maybe you're not using a charset here
MessageDigest md5 = MessageDigest.getInstance("MD5");
byte[] theDigest = md5.digest(bytesOfMessage);

你可以使用 Charset.defaultCharset().toString() 来查找每台机器上的默认字符集。更多信息请参见这个问题 - 101100

3

只有在将不同的数据输入MD5摘要时,才能得到不同的结果。一个意外的方法是将hashCode值输入。

只有一种MD5算法,在相同输入上的所有地方都会产生相同的结果。


0

检查一下你的哈希值是否被“加盐”了。加盐意味着将密码与另一个字符串连接在一起,以增加哈希安全性 (撤销彩虹表的影响)

也许你的数据库哈希值已经被加盐:这就是你的(未加盐或错误加盐)MD5哈希差异的原因。

对于 MD5 算法的每个相同输入都会产生相同的哈希值。这就是任何哈希算法的关键点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接