我在尝试检查文件的MD5哈希时遇到错误。
文件notice.txt包含以下内容:
My name is sanjay yadav . i am in btech computer science .>>
当我使用onlineMD5.com在线查看时,它将MD5指定为:90F450C33FAC09630D344CBA9BF80471
。
我的节目输出是:
My name is sanjay yadav . i am in btech computer science .
Read 58 bytes
d41d8cd98f00b204e9800998ecf8427e
这是我的代码:
import java.io.*;
import java.math.BigInteger;
import java.security.DigestException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MsgDgt {
public static void main(String[] args) throws IOException, DigestException, NoSuchAlgorithmException {
FileInputStream inputstream = null;
byte[] mybyte = new byte[1024];
inputstream = new FileInputStream("e://notice.txt");
int total = 0;
int nRead = 0;
MessageDigest md = MessageDigest.getInstance("MD5");
while ((nRead = inputstream.read(mybyte)) != -1) {
System.out.println(new String(mybyte));
total += nRead;
md.update(mybyte, 0, nRead);
}
System.out.println("Read " + total + " bytes");
md.digest();
System.out.println(new BigInteger(1, md.digest()).toString(16));
}
}
答案 0 :(得分:1)
你的代码和中存在一个错误我认为在线工具给出了错误的答案。在这里,您目前正在计算摘要两次:
md.digest();
System.out.println(new BigInteger(1, md.digest()).toString(16));
每次拨打digest()
时,都会重置内部状态。您应该删除对digest()
的第一次通话。然后,这将留下你的摘要:
2f4c6a40682161e5b01c24d5aa896da0
这与我从C#获得的结果相同,我认为这是正确的。我不知道为什么在线检查员给出的结果不正确。 (如果将其放入同一站点的 text 部分,则会得到正确的结果。)
您的代码还有其他几点:
BigInteger
作为将二进制数据转换为十六进制的方法。您可能需要用0填充它,它基本上不是该类的设计目的。使用专用的十六进制转换类,例如来自Apache Commons Codec(或各种Stack Overflow答案,为此目的提供独立的类)。finally
块中执行此操作,或在Java 7中使用try-with-resources语句。答案 1 :(得分:0)
我使用这个功能:
public static String md5Hash(File file) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
InputStream is = new FileInputStream(file);
byte[] buffer = new byte[1024];
try {
is = new DigestInputStream(is, md);
while (is.read(buffer) != -1) { }
} finally {
is.close();
}
byte[] digest = md.digest();
BigInteger bigInt = new BigInteger(1, digest);
String output = bigInt.toString(16);
while (output.length() < 32) {
output = "0" + output;
}
return output;
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}