为了防止文件被篡改,大多数比计算MD5数据进行对比:
/** * 类名 :Md5CheckFile 功能描述 :对比本地计算文件的md5与服务器计算是否一致 : */ public class Md5CheckFile { /** * 函数名 :CheckMd5Value 功能描述 :对比本地计算文件的md5与服务器计算是否一致 输入参数 : (1) 本地需要计算文件的路径 * (2) 服务器对该文件计算得到的md5 返回值 : boolean 异 常 */ public static boolean CheckMd5Value(String packagePath, String crc) { InputStream signedData = null; try { PLog.e("MD5", "server ori zip md5 is" + crc); MessageDigest sig = MessageDigest.getInstance("MD5"); File packageFile = new File(packagePath); signedData = new FileInputStream(packageFile); byte[] buffer = new byte[4096];// 每次检验的文件区大小 long toRead = packageFile.length(); long soFar = 0; boolean interrupted = false; while (soFar < toRead) { interrupted = Thread.interrupted(); if (interrupted) break; int read = signedData.read(buffer); soFar += read; sig.update(buffer, 0, read); } byte[] digest = sig.digest(); String digestStr = bytesToHexString(digest);// 将得到的MD5值进行移位转换 PLog.e("MD5", "local zip md5 is" + digestStr); digestStr = digestStr.toLowerCase(); crc = crc.toLowerCase(); if (digestStr.equals(crc)) {// 比较两个文件的MD5值,如果一样则返回true return true; } } catch (Exception e) { return false; } finally { if (signedData != null) { try { signedData.close(); } catch (IOException e) { e.printStackTrace(); } } } return false; } /** * 函数名 :bytesToHexString 功能描述 : byte数组转成String 输入参数 : (1) 数组 返回值 : string 异 * 常 :无 */ public static String bytesToHexString(byte[] src) { StringBuilder stringBuilder = new StringBuilder(""); if (src == null || src.length <= 0) { return null; } int i = 0; while (i < src.length) { int v; String hv; v = (src[i] >> 4) & 0x0F; hv = Integer.toHexString(v); stringBuilder.append(hv); v = src[i] & 0x0F; hv = Integer.toHexString(v); stringBuilder.append(hv); i++; } return stringBuilder.toString(); } }
