Java вычисляет хеш MD5 - PullRequest
       88

Java вычисляет хеш MD5

11 голосов
/ 15 октября 2011

В http://www.anyexample.com/programming/java/java_simple_class_to_compute_md5_hash.xml приведен пример расчета хеша MD5 для String.В результате получается 20-значная шестнадцатеричная строка.Согласно http://en.wikipedia.org/wiki/MD5 я бы ожидал 32-значную шестнадцатеричную строку.Я получаю тот же результат, например, используя ответ dac2009 в Как я могу сгенерировать хеш MD5? .

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

Редактировать: один пример кода

public static String MungPass(String pass) throws NoSuchAlgorithmException {
    MessageDigest m = MessageDigest.getInstance("MD5");
    byte[] data = pass.getBytes(); 
    m.update(data,0,data.length);
    BigInteger i = new BigInteger(1,m.digest());
    return String.format("%1$032X", i);
}

Взято из http://snippets.dzone.com/posts/show/3686

Ответы [ 4 ]

45 голосов
/ 15 октября 2011

используйте org.apache.commons.codec.digest.DigestUtils вместо:

DigestUtils.md5Hex(str);

в результате вы получите 32 строки символов

3 голосов
/ 15 октября 2011

Вы должны что-то упустить. Связанный код просто отлично. Убедитесь, что проблема больше нигде не связана с отображением результата. Возможности:

  • в графическом интерфейсе слишком маленький
  • в консоли с проблемами многопоточности
  • через сетевой пакет, который скоро будет отключен
  • Вы сократили длину до 20 вместо 0x20, что составляет 32.
1 голос
/ 03 января 2019

Вы можете использовать DatatypeConverter.printHexBinary (digiest) , чтобы получить 128-битный хэш, представленный 32 шестнадцатеричными числами. Ниже приведен полный фрагмент кода для генерации хеша MD5 в Java,

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import javax.xml.bind.DatatypeConverter;

public class MD5HashGenerator 
{

public static void main(String args[]) throws NoSuchAlgorithmException
{
    String stringToHash = "MyJavaCode"; 
    MessageDigest messageDigest = MessageDigest.getInstance("MD5");
    messageDigest.update(stringToHash.getBytes());
    byte[] digiest = messageDigest.digest();
    String hashedOutput = DatatypeConverter.printHexBinary(digiest);
    System.out.println(hashedOutput);
}
}
1 голос
/ 22 января 2013

Я попробовал ваш пример выше, MungPass ("java"), и я получил строку из 32 цифр, 93f725a07423fe1c889f448b33d21f46.Поскольку вы получили 20 первых из тех, которые были правильными, когда вы бежали, я предполагаю, что вы просто что-то упустили в распечатке?

...