对于使用MD5进行文件校验的疑问

长公子冰 2012-05-15 11:34:13
MD5对文件生成16进制字符串,由于文件较大,需要通过读取方式一段一段的update,那么就与这个byte[]数组的大小有关,也就是下面方法中的CACHE_SIZE,我设置1024生成的MD5与设置2048生成的MD5是不同的,那么这种问题怎么处理?还是有个不成文的默认尺寸,比如1M,大家都用这么大的缓存来验证?请知道的朋友指点迷津,谢谢!

public static String createFileMD5(String filePath) throws Exception {
String md5 = "";
File file = new File(filePath);
if (file.exists()) {
MessageDigest messageDigest = getMD5();
FileInputStream in = new FileInputStream(file);
byte[] cache = new byte[CACHE_SIZE];
while (in.read(cache) != -1) {
messageDigest.update(cache);
}
in.close();
byte data[] = messageDigest.digest();
md5 = byteArrayToHexString(data);
}
return md5;
}
...全文
464 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
rene029 2012-11-30
  • 打赏
  • 举报
回复
MD5实际计算块就是 64 字节吧,整个文件分成64字节的块,一块一块计算并没有问题,关键是中间能不能严格保证都是64字节块,如果中间有63字节的块,MD5会补充一个0进去,整个计算结果就是文件字节+ 1 个 0.我到希望能克服这个问题。
abc130314 2012-05-16
  • 打赏
  • 举报
回复
你用错方法了。

for (int i; (i = in.read(cache)) >= 0;) {
messageDigest.update(cache, 0, i);
}
昨日凡阳 2012-05-16
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

要不要我把代码全贴上来?大家测试下?7楼说的对,对不同的块update最后生成的MD5值是不同的,那国外网站提供的MD5值我们怎么知道它的缓冲是多大?如果我们设置的大小和他们生成时的不一样那不是怎么都不会验证通过。
[/Quote]

国外网站提供的MD5值是什么意思?
长公子冰 2012-05-16
  • 打赏
  • 举报
回复
要不要我把代码全贴上来?大家测试下?7楼说的对,对不同的块update最后生成的MD5值是不同的,那国外网站提供的MD5值我们怎么知道它的缓冲是多大?如果我们设置的大小和他们生成时的不一样那不是怎么都不会验证通过。
长公子冰 2012-05-16
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

引用 9 楼 的回复:

要不要我把代码全贴上来?大家测试下?7楼说的对,对不同的块update最后生成的MD5值是不同的,那国外网站提供的MD5值我们怎么知道它的缓冲是多大?如果我们设置的大小和他们生成时的不一样那不是怎么都不会验证通过。


国外网站提供的MD5值是什么意思?
[/Quote]

比如apache组织的所有软件下载旁边都会有一个MD5字符串,用于校验下载文件是否完整的。
长公子冰 2012-05-16
  • 打赏
  • 举报
回复
LSD 请指教怎么用?
长公子冰 2012-05-15
  • 打赏
  • 举报
回复
互联网上的那些软件提供MD5的,一般apache的软件比较多,都提供个MD5字符串,比如我们去验证,怎么验证?文件可大可小不会把整个文件转换成byte[]再调用update吧,那样内存非溢出不可!如果分段处理就涉及到数组大小,没有了解的朋友吗?
张自强 2012-05-15
  • 打赏
  • 举报
回复
MD5待加密的文件过大?能不能分块加密然后再对各块的密文sign加密,这样是可以的
长公子冰 2012-05-15
  • 打赏
  • 举报
回复
是不是发错板块了?
oO临时工Oo 2012-05-15
  • 打赏
  • 举报
回复
整个文件校验下来md5应该是一样的,如果不一样,可能是最后一块的问题,因为最后一块可能没有 1024个字节或者2048个字节
昨日凡阳 2012-05-15
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

谢谢LSD,我贴的方法就是分块读取,最后生成MD5,我设置的缓冲大小是1024,就是那个文件读取的byte[]大小,但是如果由其他人进行校验,他会在次生成一个MD5,与我生成的做比较,如果他的byte[]大小是2048或其他值,那么我们两个生成的字符串肯定是不同的,校验就失败了,我是想知道业界做MD5文件校验这个数组大小有约定的尺寸吗?或者?
[/Quote]

MD5加密本身是不可逆的,举个简单例子,
String a = "123456";
String b = "123456789";
这俩字符串长度不一样,你分别用MD5加密后,两个加密过的结果能一样吗?
道理一样,你在这里读取文件里面的一段,进行加密,然后更新,别人加入比较时候,读取的长度跟你的不一样,那加密后肯定跟你的这个不一样呀。
长公子冰 2012-05-15
  • 打赏
  • 举报
回复
谢谢LSD,我贴的方法就是分块读取,最后生成MD5,我设置的缓冲大小是1024,就是那个文件读取的byte[]大小,但是如果由其他人进行校验,他会在次生成一个MD5,与我生成的做比较,如果他的byte[]大小是2048或其他值,那么我们两个生成的字符串肯定是不同的,校验就失败了,我是想知道业界做MD5文件校验这个数组大小有约定的尺寸吗?或者?
zqfddqr 2012-05-15
  • 打赏
  • 举报
回复
应该是用字节流读取 不能一下读到内存中
http://hi.baidu.com/hcjhuanghe/blog/item/3d1111585d8386d89c820494.html
长公子冰 2012-05-15
  • 打赏
  • 举报
回复
MD5额,没有人用过吗?

50,542

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧