网创优客建站品牌官网
为成都网站建设公司企业提供高品质网站建设
热线:028-86922220
成都专业网站建设公司

定制建站费用3500元

符合中小企业对网站设计、功能常规化式的企业展示型网站建设

成都品牌网站建设

品牌网站建设费用6000元

本套餐主要针对企业品牌型网站、中高端设计、前端互动体验...

成都商城网站建设

商城网站建设费用8000元

商城网站建设因基本功能的需求不同费用上面也有很大的差别...

成都微信网站建设

手机微信网站建站3000元

手机微信网站开发、微信官网、微信商城网站...

建站知识

当前位置:首页 > 建站知识

MD5错误导致的血案

   之前在工作中需要使用MD5来判断APK是否是同一个文件,开始服务端和客户端使用MD5的方式是没有问题的,但是随着APK文件越来越多,有一天忽然发现同一个APK客户端和服务端计算的MD5值不相同,导致APK上传失败问题,经过仔细排查,发现客户端生成的MD5少了一位,客户端一直采用如下的方式计算.

通榆ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:18980820575(备注:SSL证书合作)期待与您的合作!

 BigInteger bigInt = new BigInteger(1, digest.digest());
 bigInt.toString(16);

    这种方式来计算,后来通过验证发现,大部分时间这种方式是没问题的,但是当遇到第一位数字是0时,就会发现得到的MD5把首位的0丢掉啦(很隐蔽的一个坑呀),原因是bigint进行16进制转换的时候第一个0被自动去掉了

    所以不建议使用这种方式来计算一个文件的MD5,可以使用下面的方式:

public class MD5Util {                                                                                   

	protected static char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6',
			'7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };

	public synchronized static String getAgentMD5(String path) {
		File file = new File(path);
		if (!file.exists() || !file.isFile()) {
			System.out.println("文件不存在");
			return null;
		}
		MessageDigest digest = null;
		FileInputStream fis = null;
		try {
			digest = MessageDigest.getInstance("MD5");
			fis = new FileInputStream(file);
			byte[] buffer = new byte[1024];
			int numRead = 0;
			while ((numRead = fis.read(buffer)) > 0) {				
				digest.update(buffer, 0, numRead);				
			}
			
			fis.close();	
		} catch (Exception e) {
			// TODO: handle exception
		}
		
		return bufferToHex(digest.digest());
	}

	private static String bufferToHex(byte bytes[]) {
		return bufferToHex(bytes, 0, bytes.length);
	}

	private static String bufferToHex(byte bytes[], int m, int n) {
		StringBuffer stringbuffer = new StringBuffer(2 * n);
		int k = m + n;
		for (int l = m; l < k; l++) {
			appendHexPair(bytes[l], stringbuffer);
		}
		return stringbuffer.toString();
	}

	private static void appendHexPair(byte bt, StringBuffer stringbuffer) {
		char c0 = hexDigits[(bt & 0xf0) >> 4];// 取字节中高 4 位的数字转换, 
											
		char c1 = hexDigits[bt & 0xf];// 取字节中低 4 位的数字转换
		stringbuffer.append(c0);
		stringbuffer.append(c1);
	}
	
	public static void main(String[] args) {
	
	}


本文名称:MD5错误导致的血案
本文来源:http://bjjierui.cn/article/gjsdio.html

其他资讯