Java MessageDigest не работает - PullRequest
       55

Java MessageDigest не работает

2 голосов
/ 04 октября 2011

Я не могу заставить работать MessageDigest, программа выдает мне две ошибки: UnsupportedEncodingException, NoSuchAlgorithmException

 byte[] bytesOfchat_key = "lol".getBytes("UTF-8");
 MessageDigest md = MessageDigest.getInstance("MD5");
 byte[] Digest = md.digest(bytesOfchat_key);

Если я выбрасываю ошибки, это дает мне response ￟ ᄡ 9 ᅦ ヌ np> 0xd ￉ z в качестве ответа (16 символов)

PS: я использовал для печати дайджеста

for (byte b : Digest) {
    System.out.print((char)b);
}

Ответы [ 3 ]

4 голосов
/ 04 октября 2011

md5 возвращает шестнадцатеричные числа, поэтому для декодирования его в строку вы можете использовать

String plaintext = "lol";
MessageDigest m = MessageDigest.getInstance("MD5");
m.reset();
m.update(plaintext.getBytes());
byte[] digest = m.digest();
//Decoding
BigInteger bigInt = new BigInteger(1,digest);
String hashtext = bigInt.toString(16);
while(hashtext.length() < 32 ){
  hashtext = "0"+hashtext;
}
1 голос
/ 04 октября 2011

Байты, генерируемые MessageDigest, не обязательно представляют печатные символы. Вы должны отобразить числовое значение каждого байта или преобразовать массив байтов в строку Base64, чтобы иметь что-то для печати. ​​

См. apache commons-codec , чтобы получить реализацию Base64.

Два исключения, которые вы вынуждены обрабатывать, никогда не должны возникать, потому что UTF-8 гарантированно поддерживается любой JVM, а алгоритм MD5 также изначально поддерживается JVM. Таким образом, вы должны заключить код в блок try catch следующим образом:

try {
    byte[] bytesOfchat_key = "lol".getBytes("UTF-8");
    MessageDigest md = MessageDigest.getInstance("MD5");
    byte[] Digest = md.digest(bytesOfchat_key);
}
catch (NoSuchAlgorithmException e) {
    throw new RuntimeException("something impossible just happened", e);
}
catch (UnsupportedEncodingException e) {
    throw new RuntimeException("something impossible just happened", e);
}
1 голос
/ 04 октября 2011

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

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

  • Кодировать каждый байт в виде пары шестнадцатеричных цифр
  • Использовать кодировку Base64 для полного байтового массива

Каждый из них может быть легко реализован с помощью Кодека Apache Commons .

В MessageDigest нет ничего плохого, но я полагаю, что у вас неверное понимание того, как работают исключения и как обрабатывать двоичные данные иначе, чем текстовые данные.

...