MD5错误导致的血案

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

 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) {

	}
时间: 2024-10-01 05:00:59

MD5错误导致的血案的相关文章

修改DNS域名转发器解决IP地址解析错误导致的网站不能访问

修改DNS域名转发器解决IP地址解析错误导致的网站不能访问 首先谢谢同事林路的指导,才能顺利解决问题 打开网站,访问一个域名,DNS解析到错误的IP地址,那么将不能正确访问该网站 1.使用8.8.8.8(google 公用dns定位本地dns解析和google解析),这里是zh.wikipedia.org ping zh.wikipedia.org     159.106.121.75(这个是很多dns异常解析的地址) nslookup -qt zh.wikipedia.org 8.8.8.8

mysql连接错误导致用户blocked

1.每过一段时间线上业务就会出现如下错误: kHost 'XXXXX' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'Connection closed by foreign host 2.需要使用mysqladmin flush-hosts解锁用户 3.查看错误日志 4.查看官方文档对max_connect_errors的解释如下     当某用户连续的错误连接达到max_c

eclipse启动tomcat,突然出现 fail to start错误,导致不能启动

尝试了 1.重新安装tomcat 2.重新在eclipse中配置tomcat服务器 都没能解决 ===================================== 最后看了一个外文的问答页,其中一个回答让仔细检查web.xml文件 肉眼还是看不出什么问题,但是把最后配置的一个servlet重新配一下就好了 注意:在配置web.xml的时候要按照xml的约束规则 排列各个标签的出现顺序 eclipse启动tomcat,突然出现 fail to start错误,导致不能启动,布布扣,bubu

gcc参数-l传递顺序错误导致`undefined reference&#39;的一点小结

刚才编译一个pthread的单文件程序, 使用的命令行是: gcc -o thread1 -lpthread thread1.c 结果报错: 1 $ gcc -o thread1 -lpthread thread1.c 2 /tmp/ccNqs6Bh.o: In function `main': 3 thread1.c:(.text+0x49): undefined reference to `pthread_create' 4 thread1.c:(.text+0x5f): undefined

Eclipse错误导致无法启动The workspace exited with unsaved changes in the previous session

MyOpenSUSE:/home/jin/workspace # tail -f .metadata/.log !SESSION 2014-05-04 11:35:58.869 -----------------------------------------------eclipse.buildId=4.3.2.M20140221-1700java.version=1.7.0_51java.vendor=Oracle CorporationBootLoader constants: OS=li

Linux在fstab中因配置错误导致服务器主机无法重启的问题应该如何解决

fstab中配置错误导致系统无法启动的恢复方案 1制造错误的案例发生,在/etc/fstab中配置如下内容 结尾的倒数第一个为1表示进行磁盘检查,为0表示不进行磁盘检查,倒数第二个为0表示不备份,为1表示进行备份,一般除了/boot 和 / 使用磁盘检查,其余的都不使用磁盘检查.备份自己去备份,没必要让系统去帮你备份. 重启服务器主机,在启动过程中就会报错 2处理错误 上面的错误提示我们给出root密码或者使用Ctrl+D继续,但是Ctrl+D还是会重启,所以我们给出root密码进行处理. 给出

网关配置错误导致Outlook无法连线

最近碰到一个Outlook 无法连接的问题,经过反复研究,最后发现是网关错误导致,下面将排错方法和过程分享给大家! 环境介绍:服务器Exchange 2010,用户端:Win7+Office2010,Win10+Office2016,内网用户通过Outlook以Exchange Client方式连接到Exchange 2010,同一网络,用户禁止访问Internet,之前一直工作正常! 问题描述:突然有一天,接用户报障:Win10+Office2016用户, Outlook无法工作,显示断线,无

xcode5 asset catalogs 由于图标尺寸错误导致编译问题解决[原创]

如下图,即使图片尺寸不规范,xcode5也可以正常预览(这里我提供的尺寸是57*57, 而需要的是120*120) 但编译运行失败,报的错是: Images.xcassets: error: The app icon set named "AppIcon" did not have any applicable content. Images.xcassets:./AppIcon.appiconset/[iphone][60x60][2x]: warning: AppIcon.appi

linux异常处理:selinux配置错误导致无法重启

点击返回自学Linux集锦 linux异常处理:selinux配置错误导致无法重启 一次linux无法重启异常记录: 当时第一反应就是梳理最近的配置变更,特别是能预知相关的就是selinux配置变更. 原来是误将SELINUXTYPE看成SELINUX后,将其值改为disabled.导致操作系统服务启动,无法进入单用户模式.变更回来之后,一切正常. 解决方法一: 系统启动的时候,按下'e'键进入grub编辑界面,编辑grub菜单,使用上下键选择"kernel " 一行,按'e'键进入编