9

Javaメッセージダイジェストを使用して、認証に使用されるMD5ハッシュを作成しています。MD5ハッシュは、varchar2としてデータベースに保存されます。ローカルラップトップのTomcatサーバーでユーザーを作成するためのテストを行いました。Linux Redhat上のテストTomcatサーバーにwarをデプロイしたとき、ハッシュが一致しないために認証が失敗しました。ユーザー名とパスワードを確認しました。すべて正しいです。両方の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)
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ダイジェストにフィードする場合のみ。これを誤って行う方法の1つは、hashCode値を入力することです。

MD5アルゴリズムは1つだけであり、同じ入力でどこでも同じ結果を生成します。

于 2011-08-03T15:11:12.913 に答える
0

ハッシュがソルトされているかどうかを確認します。ソルトとは、パスワードを別の文字列に連結して、ハッシュのセキュリティを強化することを意味します(レインボーテーブルの効果を元に戻すため)

データベースハッシュがソルトされている場合があります。したがって、(ソルトされていない、またはソルトが間違っている)MD5ハッシュの違いです。

MD5アルゴリズムへの同じ入力はすべて、同じハッシュになります。これがハッシュアルゴリズムのポイントです。

于 2011-08-03T15:12:01.323 に答える