Контрольная сумма MD5 из входного потока

1

Я пытаюсь получить сумму md5 входного потока, но строка, которую я получаю, зашифрована неправильно.

Строка md5, которую я получаю, это: ä?E´]Õaá*TàŠöJ

Когда это должно быть: e48f0b45b45dd56102e12a54e08af64a

Можете ли вы определить, что я делаю неправильно? Вот рабочая программа:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class main {

public static void main(String[] args) throws IOException {

    byte[] fileContents = new byte[15 * 10000000];

    FileOutputStream out = new FileOutputStream("C:\\testFile");
    out.write(fileContents);
    out.close();

    File file = new File("C:\\testFile");
    FileInputStream fs = new FileInputStream(file);

    System.out.println(new String(getBytesOfMd5(fs)));

}

public static byte[] getBytesOfMd5(InputStream is) throws IOException {
    byte[] buffer = new byte[1024];
    MessageDigest complete = null;
    try {
        complete = MessageDigest.getInstance("MD5");
    } catch (NoSuchAlgorithmException e) {
        return null;
    }

    int numRead;
    do {
        numRead = is.read(buffer);
        if (numRead > 0) {
            complete.update(buffer, 0, numRead);
        }
    } while (numRead != -1);

    is.close();
    return complete.digest();
}
}
  • 1
    вам просто нужно преобразовать байтовый массив в шестнадцатеричный ... Есть подходящий метод ( printHexBinary ) в javax.xml.DatatypeConverter
  • 0
    Также - посмотрите на класс DigestInputStream
Показать ещё 1 комментарий
Теги:
md5

2 ответа

3
Лучший ответ

Метод digest() возвращает хэш как байты. Затем вы попытались повернуть эти байты в строку напрямую.

Вы хотели бы преобразовать каждый из этих байтов в две шестнадцатеричные цифры. Вот код:

byte[] hash = complete.digest();
StringBuilder sb = new StringBuilder();
for (byte b : hash)
  sb.append(String.format("%02x", b & 0xFF));
String hexHash = sb.toString();
System.out.println(hexHash);
  • 0
    Использование java.util.Formatter напрямую было бы лучше, чем использование String.format для каждого байта.
  • 0
    @VGR и использование javax.xml.DatatypeConvert.printHexBinary было бы еще лучше! Это стандартная функция JDK ...
1

Вам просто нужно преобразовать массив байтов в hex:

import javax.xml.DatatypeConverter;

String hex = DatatypeConverter.printHexBinary(getBytesOfMd5(fs));

NB: вы можете также обернуть ваш InputStream с помощью DigestInputStream чтобы он автоматически DigestInputStream дайджест для вас, когда вы читаете поток.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню