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

时间:2011-08-03 15:03:47

标签: java md5 message-digest

我正在使用java消息摘要来创建MD5哈希,用于身份验证。 MD5哈希作为varchar2存储在数据库中。我做了一个测试,在我的本地笔记本电脑上的tomcat服务器上创建用户。当我将战争部署到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)

3 个答案:

答案 0 :(得分:6)

您可能正在使用默认字符集来生成要传递到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);

答案 1 :(得分:3)

仅当您将不同的数据输入MD5摘要时。一旦意外地做到这一点就是提供hashCode值。

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

答案 2 :(得分:0)

检查您的哈希值是否为 salted 。 Salting表示密码连接到另一个字符串,以增加散列安全性(撤消 rainbow tables 的效果)

可能是您的数据库哈希值已被腌制:因此您的(未加盐的或错误的盐渍)MD5哈希值之间存在差异。

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