Java MD5 Copy函数生成不同的摘要
Java MD5 Copy function generates different digest
我正在试验 Java 并创建了一个复制文件并生成 MD5 校验和的小程序。该程序运行并生成校验和,但复制的结果文件与原始校验和不匹配。
我是Java的新手,不明白这里的问题是什么。我是否将错误的缓冲区写入输出文件?
package com.application;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigInteger;
import java.security.MessageDigest;
public class Main {
static int secure_copy(String src, String dest) throws Exception {
InputStream inFile = new FileInputStream(src);
OutputStream outFile = new FileOutputStream(dest);
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] buf = new byte[1024];
int numRead;
do {
numRead = inFile.read(buf);
if (numRead > 0) {
md.update(buf, 0, numRead);
outFile.write(buf);
outFile.flush();
}
} while (numRead != -1);
inFile.close();
outFile.close();
BigInteger no = new BigInteger(1, md.digest());
String result = no.toString(16);
while(result.length() < 32) {
result = "0" + result;
}
System.out.println("MD5: " + result);
return 0;
}
public static void main(String[] args) {
try {
secure_copy(args[0], args[1]);
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
}
}
}
源文件的输出:(正确)
MD5: 503ea121d2bc6f1a2ede8eb47f0d13ef
复制功能的文件,通过md5sum
检查
md5sum file.mov
56883109c28590c33fb31cc862619977 file.mov
您正在将 整个 缓冲区写入输出文件,而不仅仅是包含最新读取数据的部分。修复很简单:
if (numRead > 0) {
md.update(buf, 0, numRead);
outFile.write(buf, 0, numRead);
}
每次从 InputStream 读取时,代码都会不断更改数据以计算其哈希值。与其在循环中调用 md.update(buf, 0, numRead);
,不如将整个文件读入 byte[]
,然后调用一次 md.update(entireFileByeArray)
。 (请参阅 this answer 了解在打开文件之前找到合适数组大小的方法。)
我正在试验 Java 并创建了一个复制文件并生成 MD5 校验和的小程序。该程序运行并生成校验和,但复制的结果文件与原始校验和不匹配。
我是Java的新手,不明白这里的问题是什么。我是否将错误的缓冲区写入输出文件?
package com.application;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigInteger;
import java.security.MessageDigest;
public class Main {
static int secure_copy(String src, String dest) throws Exception {
InputStream inFile = new FileInputStream(src);
OutputStream outFile = new FileOutputStream(dest);
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] buf = new byte[1024];
int numRead;
do {
numRead = inFile.read(buf);
if (numRead > 0) {
md.update(buf, 0, numRead);
outFile.write(buf);
outFile.flush();
}
} while (numRead != -1);
inFile.close();
outFile.close();
BigInteger no = new BigInteger(1, md.digest());
String result = no.toString(16);
while(result.length() < 32) {
result = "0" + result;
}
System.out.println("MD5: " + result);
return 0;
}
public static void main(String[] args) {
try {
secure_copy(args[0], args[1]);
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
}
}
}
源文件的输出:(正确)
MD5: 503ea121d2bc6f1a2ede8eb47f0d13ef
复制功能的文件,通过md5sum
md5sum file.mov
56883109c28590c33fb31cc862619977 file.mov
您正在将 整个 缓冲区写入输出文件,而不仅仅是包含最新读取数据的部分。修复很简单:
if (numRead > 0) {
md.update(buf, 0, numRead);
outFile.write(buf, 0, numRead);
}
每次从 InputStream 读取时,代码都会不断更改数据以计算其哈希值。与其在循环中调用 md.update(buf, 0, numRead);
,不如将整个文件读入 byte[]
,然后调用一次 md.update(entireFileByeArray)
。 (请参阅 this answer 了解在打开文件之前找到合适数组大小的方法。)