Получить строку MD5 из дайджеста сообщений
Я понимаю, как это работает, но если я хочу распечатать MD5 как String, как бы я это сделал?
public static void getMD5(String fileName) throws Exception{
InputStream input = new FileInputStream(fileName);
byte[] buffer = new byte[1024];
MessageDigest hash = MessageDigest.getInstance("MD5");
int read;
do {
read = input.read(buffer);
if (read > 0) {
hash.update(buffer, 0, read);
}
} while (read != -1);
input.close();
}
Ответы
Ответ 1
Попробуйте это
StringBuffer hexString = new StringBuffer();
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] hash = md.digest();
for (int i = 0; i < hash.length; i++) {
if ((0xff & hash[i]) < 0x10) {
hexString.append("0"
+ Integer.toHexString((0xFF & hash[i])));
} else {
hexString.append(Integer.toHexString(0xFF & hash[i]));
}
}
Ответ 2
Вы можете записать это меньше:
String hex = (new HexBinaryAdapter()).marshal(md5.digest(YOUR_STRING.getBytes()))
Ответ 3
Вы также можете использовать библиотеку Apache Commons Codec.
Эта библиотека включает методы public static String md5Hex(InputStream data)
и public static String md5Hex(byte[] data)
в классе DigestUtils
.
Не нужно самостоятельно это придумывать;)
Ответ 4
String input = "168";
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] md5sum = md.digest(input.getBytes());
String output = String.format("%032X", new BigInteger(1, md5sum));
или
DatatypeConverter.printHexBinary( MessageDigest.getInstance("MD5").digest("a".getBytes("UTF-8")))
Ответ 5
Сначала вам нужно получить byte[]
вывод MessageDigest
:
byte[] bytes = hash.digest();
Вы не можете легко напечатать это, хотя (например, new String(bytes)
), потому что он будет содержать двоичный файл, который не будет иметь хороших выходных представлений. Вы можете преобразовать его в шестнадцатеричный для отображения, как это, однако:
StringBuilder sb = new StringBuilder(2 * bytes.length);
for (byte b : bytes) {
sb.append("0123456789ABCDEF".charAt((b & 0xF0) >> 4));
sb.append("0123456789ABCDEF".charAt((b & 0x0F)));
}
String hex = sb.toString();
Ответ 6
С массивом байтов результат из дайджеста сообщения:
...
byte hashgerado[] = md.digest(entrada);
...
for(byte b : hashgerado)
System.out.printf("%02x", Byte.toUnsignedInt(b));
Результат (например):
89e8a9f68ad3c4bba9b9d3581cf5201d
Ответ 7
/**
* hashes:
* e7cfa2be5969e235138356a54bad7fc4
* 3c9ec110aa171b57bb41fc761130822c
*
* compiled with java 8 - 12 Dec 2015
*/
public static String generateHash() {
long r = new java.util.Random().nextLong();
String input = String.valueOf(r);
String md5 = null;
try {
java.security.MessageDigest digest = java.security.MessageDigest.getInstance("MD5");
//Update input string in message digest
digest.update(input.getBytes(), 0, input.length());
//Converts message digest value in base 16 (hex)
md5 = new java.math.BigInteger(1, digest.digest()).toString(16);
}
catch (java.security.NoSuchAlgorithmException e) {
e.printStackTrace();
}
return md5;
}
Ответ 8
FYI...
В определенных ситуациях это не сработало для меня
md5 = new java.math.BigInteger(1, digest.digest()).toString(16);
но это сделало
StringBuilder sb = new StringBuilder();
for (int i = 0; i < digest.length; i++) {
if ((0xff & digest[i]) < 0x10) {
sb.append("0").append(Integer.toHexString((0xFF & digest[i])));
} else {
sb.append(Integer.toHexString(0xFF & digest[i]));
}
}
String result = sb.toString();
Ответ 9
Вызовите hash.digest()
, чтобы завершить процесс. Он вернет массив байтов.
Вы можете создать String из byte[]
с помощью конструктора String, однако, если вам нужна шестнадцатеричная строка, вам придется вручную перебирать массив байтов и обрабатывать символы.
Ответ 10
Это еще одна версия ответа @anything:
StringBuilder sb = new StringBuilder();
for (int i = 0; i < digest.length; i++) {
if ((0xff & digest[i]) < 0x10) {
sb.append("0").append(Integer.toHexString((0xFF & digest[i])));
} else {
sb.append(Integer.toHexString(0xFF & digest[i]));
}
}
String result = sb.toString();