Преобразование массива MD5 в строку java

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

sun.misc.BASE64Encoder().encode(messageDigest.digest())  

Я думаю, есть лучший способ сделать это.
Спасибо заранее!

Ответы

Ответ 1

MessageDigest md = MessageDigest.getInstance("MD5");
byte[] arr = md.digest(bytesOfMessage);
return Base64.getEncoder().encodeToString(arr);

note: md5 больше не рассматривается как хороший алгоритм хеширования, рассмотрите выбор SHA

Ответ 2

Я бы использовал commons-codec

  • Base64 - Base64.encodeBase64(digestBytes)
  • Hex-string - Hex.encodeHex(digestBytes)

Ответ 3

// Convert to hex string
StringBuffer sb = new StringBuffer();
for (int i = 0; i < messageDigest.length; i++) {
    if ((0xff & messageDigest[i]) < 0x10) {
        sb.append('0');
    }
    sb.append(Integer.toHexString(0xff & messageDigest[i]));
}
String md5 = sb.toString();

Это предполагает, что вы действительно хотите, чтобы ваш MD5 печатался как шестнадцатеричная строка, а не BASE64-кодированная. То, как это обычно представляется.

Ответ 4

Я видел следующее решение:

    byte[] digest = md.digest(someDataByteArray);
    StringBuilder hex = new StringBuilder();
    for (byte b : digest) {
        hex.append(String.format("%02x", b));
    }

Ответ 5

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

...
String input = "westerngun";
MessageDigest digest = MessageDigest.getInstance("MD5"); // not thread-safe, create instance for each thread
byte[] result = digest.digest(input.getBytes()); // get MD5 hash array, could contain negative
String hex = DatatypeConverter.printHexBinary(result).toLowerCase(); // convert byte array to hex string

Если вам нужен номер:

Integer number = Integer.parseInt(hex, 16); // parse hex number to integer. If overflowed, use Long.parseLong()