Будет ли Java Messagingigest генерировать разные MD5 хэш на разных версиях JDK? - PullRequest
8 голосов
/ 03 августа 2011

Я использую дайджест сообщения Java для создания хеша MD5, который используется для аутентификации. Хеш MD5 хранится в базе данных как varchar2. Я сделал тест, чтобы создать пользователя на моем сервере Tomcat на моем локальном ноутбуке. Когда я развернул войну на тестовом сервере Tomcat в Linux Redhat, аутентификация не удалась из-за несоответствия хеша. Я проверил имя пользователя и пароль: все они верны. Оба веб-сервера указывают на одну и ту же базу данных.

Я подозреваю, что хеш, сгенерированный на моем локальном ноутбуке, отличается от хеша, сгенерированного тестовым сервером. Я прав?

Ниже приведен код, с помощью которого я сгенерировал хеш.

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)

Вот вывод версии Java на сервере Redhat

[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 ]

6 голосов
/ 03 августа 2011

Возможно, вы используете набор символов по умолчанию для генерации байтов, которые вы передаете методу 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);
3 голосов
/ 03 августа 2011

Только если вы вводите разные данные в дайджест MD5. Один из способов сделать это случайно - ввести значения hashCode.

Существует только один алгоритм MD5, и он будет давать одинаковый результат везде на одном и том же входе.

0 голосов
/ 03 августа 2011

Проверьте, является ли ваш хеш соленым . Соль означает, что пароль соединен с другой строкой, чтобы повысить безопасность хеширования (чтобы отменить эффект радужных таблиц ) .

Может случиться так, что хэши вашей базы данных засолены: отсюда разница между вашими (несолеными или неправильно засоленными) хешами MD5.

Каждый одинаковый ввод в алгоритм MD5 приводит к одному и тому же хешу. В этом смысл любого алгоритма хеширования.

...