日期:2014-05-20  浏览次数:20781 次

对于使用MD5进行文件校验的疑问
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;
}

------解决方案--------------------
是不是发错板块了?
------解决方案--------------------
MD5待加密的文件过大?能不能分块加密然后再对各块的密文sign加密,这样是可以的
------解决方案--------------------
互联网上的那些软件提供MD5的,一般apache的软件比较多,都提供个MD5字符串,比如我们去验证,怎么验证?文件可大可小不会把整个文件转换成byte[]再调用update吧,那样内存非溢出不可!如果分段处理就涉及到数组大小,没有了解的朋友吗?
------解决方案--------------------
MD5额,没有人用过吗?
------解决方案--------------------
应该是用字节流读取 不能一下读到内存中 
http://hi.baidu.com/hcjhuanghe/blog/item/3d1111585d8386d89c820494.html
------解决方案--------------------
谢谢LSD,我贴的方法就是分块读取,最后生成MD5,我设置的缓冲大小是1024,就是那个文件读取的byte[]大小,但是如果由其他人进行校验,他会在次生成一个MD5,与我生成的做比较,如果他的byte[]大小是2048或其他值,那么我们两个生成的字符串肯定是不同的,校验就失败了,我是想知道业界做MD5文件校验这个数组大小有约定的尺寸吗?或者?
------解决方案--------------------
引用:
谢谢LSD,我贴的方法就是分块读取,最后生成MD5,我设置的缓冲大小是1024,就是那个文件读取的byte[]大小,但是如果由其他人进行校验,他会在次生成一个MD5,与我生成的做比较,如果他的byte[]大小是2048或其他值,那么我们两个生成的字符串肯定是不同的,校验就失败了,我是想知道业界做MD5文件校验这个数组大小有约定的尺寸吗?或者?


MD5加密本身是不可逆的,举个简单例子,
String a = "123456";
String b = "123456789";
这俩字符串长度不一样,你分别用MD5加密后,两个加密过的结果能一样吗?
道理一样,你在这里读取文件里面的一段,进行加密,然后更新,别人加入比较时候,读取的长度跟你的不一样,那加密后肯定跟你的这个不一样呀。
------解决方案--------------------
整个文件校验下来md5应该是一样的,如果不一样,可能是最后一块的问题,因为最后一块可能没有 1024个字节或者2048个字节
------解决方案--------------------
要不要我把代码全贴上来?大家测试下?7楼说的对,对不同的块update最后生成的MD5值是不同的,那国外网站提供的MD5值我们怎么知道它的缓冲是多大?如果我们设置的大小和他们生成时的不一样那不是怎么都不会验证通过。
------解决方案--------------------
引用:
要不要我把代码全贴上来?大家测试下?7楼说的对,对不同的块update最后生成的MD5值是不同的,那国外网站提供的MD5值我们怎么知道它的缓冲是多大?如果我们设置的大小和他们生成时的不一样那不是怎么都不会验证通过。


国外网站提供的MD5值是什么意思?
------解决方案--------------------
你用错方法了。

for (int i; (i = in.read(cache)) >= 0;) {
messageDigest.update(cache, 0, i);
}

------解决方案--------------------
LSD  请指教怎么用?
------解决方案--------------------
引用:
引用:

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