будет ли java messagedigest генерировать другой хеш MD5 в другой версии jdk?

Я использую дайджест сообщений 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)

person sse    schedule 03.08.2011    source источник
comment
Я подозреваю, что хэш, сгенерированный на моем локальном портативном компьютере, отличается от хэша, сгенерированного тестовым сервером. Я прав? Нет, не прав.   -  person bestsss    schedule 03.08.2011
comment
Если это действительно другое, это будет серьезной ошибкой в ​​реализации. Покажите свой код, и мы поможем вам найти причину.   -  person Paŭlo Ebermann    schedule 03.08.2011


Ответы (3)


Возможно, вы используете набор символов по умолчанию для генерации байтов, которые вы передаете в метод 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);
person Kal    schedule 03.08.2011
comment
Вы можете использовать Charset.defaultCharset().toString(), чтобы узнать, какой набор символов используется по умолчанию на каждой машине. Дополнительную информацию см. В этом вопросе. - person 101100; 03.08.2011

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

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

person bmargulies    schedule 03.08.2011

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

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

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

person Pindatjuh    schedule 03.08.2011