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());
}

返回的 String 将保存在数据库表中,该表定义如下

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)
4

3 回答 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);
于 2011-08-03T15:13:46.830 回答
3

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

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

于 2011-08-03T15:11:12.913 回答
0

检查您的哈希是否是salted。加盐意味着将密码连接到另一个字符串,以增加散列安全性(撤消彩虹表的影响)

您的数据库哈希可能是加盐的:因此您的(未加盐或错误加盐的)MD5 散列之间的差异。

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

于 2011-08-03T15:12:01.323 回答