2014-10-15 4 views
0

Чтобы защитить мое веб-приложение, я подумал о шифровании поля пароля с MD5. Я использовал этот код.MD5 не последовательно генерирует одни и те же зашифрованные данные для одного и того же пароля

  byte[] bytesOfMessage; 
      String password= "123456789"; 
      bytesOfMessage = password.getBytes("UTF-8"); 

      MessageDigest md = MessageDigest.getInstance("MD5"); 
      byte[] thedigest = md.digest(bytesOfMessage); 
      String newPassword = thedigest.toString(); 

Но в форме входа в систему, когда я проверяю пароль, я обнаружил, что тот же алгоритм произвел разные хэши MD5. Может ли кто-нибудь сказать мне, почему?

+0

Что значит «тот же алгоритм»? Понятно, что это другой алгоритм. Но мы не можем сказать вам, в чем разница между двумя вещами, если вы только покажете нам одну из них. Возможно, вы можете включить код, который вы используете в форме входа. –

+0

Это работает, спасибо, Можете ли вы объяснить мне разницу? Я могу получить его, потому что я думал, что это одно и то же. – user1645638

+0

Вы спросили, какая разница между двумя разными вещами. Но вы только показали нам одну из двух вещей. Мне нужен хрустальный шар, чтобы ответить на этот вопрос. –

ответ

2

Во-первых, вы не вычисления MD5, но SHA-1:

MessageDigest md = MessageDigest.getInstance("SHA-1"); 

Изменить его:

MessageDigest md = MessageDigest.getInstance("MD5"); 

Во-вторых, чтобы преобразовать массив байтов в String, у вас есть 2 варианта: либо преобразовать его в шестнадцатеричную строку (предпочтительно), либо в строку base64.

Вот как вы можете конвертировать byte[] в String:

Convert from byte array to hex string in java

+0

да, это правда, но это ошибка записи на ленту, ну, я пытаюсь использовать различный тип шифрования, и я получаю его работу, когда я меняю thedigest.toString() на новую строку (thedigest) – user1645638

1

Так фактический ответ: Вы назвали byte[].toString() вместо new String(byte[], StandardCharsets.UTF_8).

toString на байт-массивах всегда работает как Object.toString. То есть, он возвращает текст на основе имени класса и хеш-кода идентификатора. Реализация ObjecthashCode основана на идентичности объекта, а не на его содержимом. Таким образом, для разных прогонов метода выделяются отдельные массивы, приводящие к различным хэш-кодам, даже если массивы в конечном итоге содержат одни и те же байты. Arrays.toString возвращает строку, основанную на содержимом массива. Это дает результат, как "[2, 1, 0, 100]".

new String(byte[])(выглядит это) использует набор символов по умолчанию, который может меняться между прогонами. Я использовал новый Java SE 8 java.nio.charset.StandardCharsets, но new String(thedigest, "UTF-8") также должен работать, если я набрал «UTF-8» правильно.

Смежные вопросы