java messagedigest会在不同的jdk版本上生成不同的MD5哈希吗?

java messagedigest会在不同的jdk版本上生成不同的MD5哈希吗?,java,md5,message-digest,Java,Md5,Message Digest,我正在使用java消息摘要创建MD5哈希,用于身份验证。MD5散列作为varchar2存储在数据库中。我做了一个测试,在本地笔记本电脑的tomcat服务器上创建一个用户。当我将war部署到linux redhat上的测试tomcat服务器时,由于哈希不匹配,身份验证失败。我检查了用户名和密码:它们都是正确的。两个web服务器都指向同一个数据库 我怀疑本地笔记本电脑上生成的哈希与测试服务器生成的哈希不同。我说得对吗 下面是我生成散列的代码 public static String getMD5Ha

我正在使用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)

仅当您将不同的数据输入MD5摘要时。一个偶然的方法是输入hashCode值


只有一个MD5算法,在同一个输入上,它会在任何地方产生相同的结果。

检查您的散列是否被腌制。Salting意味着将密码连接到另一个字符串,以提高哈希安全性(撤消rainbow表的效果)

您的数据库哈希可能是盐渍的:因此,您的(未盐渍的或盐渍错误的)MD5哈希之间存在差异


MD5算法的每个相同输入都会产生相同的散列。这就是任何哈希算法的要点。

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

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

比如说--


我怀疑本地笔记本电脑上生成的哈希与测试服务器生成的哈希不同。我说得对吗?不,你不是。如果它真的不同,这将是实现中的一个重要错误。显示您的代码,然后我们可以帮助您找到原因。您可以使用
Charset.defaultCharset().toString()
找出每台机器上的默认字符集。有关更多信息,请参阅。
byte[] bytesOfMessage = tempStr.getBytes("UTF-8"); // Maybe you're not using a charset here
MessageDigest md5 = MessageDigest.getInstance("MD5");
byte[] theDigest = md5.digest(bytesOfMessage);