Я пытаюсь получить сумму 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();
}
}
Метод 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);
String.format
для каждого байта.
javax.xml.DatatypeConvert.printHexBinary
было бы еще лучше! Это стандартная функция JDK ...
Вам просто нужно преобразовать массив байтов в hex:
import javax.xml.DatatypeConverter;
String hex = DatatypeConverter.printHexBinary(getBytesOfMd5(fs));
NB: вы можете также обернуть ваш InputStream
с помощью DigestInputStream
чтобы он автоматически DigestInputStream
дайджест для вас, когда вы читаете поток.
printHexBinary
) вjavax.xml.DatatypeConverter
DigestInputStream