package com.marshalchen.common.commonUtils.urlUtils; import android.text.TextUtils; import com.marshalchen.common.commonUtils.logUtils.Logs; import java.io.*; import java.math.BigInteger; import java.security.DigestInputStream; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; /** * * User: cym * Date: 13-10-30 * Time: 上午10:49 * */ //MD5Utils public class MD5Utils { public static String getMD5(String content) { try { MessageDigest digest = MessageDigest.getInstance("MD5"); digest.update(content.getBytes()); return getHashString(digest); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return null; } private static String getHashString(MessageDigest digest) { StringBuilder builder = new StringBuilder(); for (byte b : digest.digest()) { builder.append(Integer.toHexString((b >> 4) & 0xf)); builder.append(Integer.toHexString(b & 0xf)); } return builder.toString(); } public static String fileMD5(String inputFile) throws IOException { // 缓冲区大小(这个可以抽出一个参数) int bufferSize = 256 * 1024; FileInputStream fileInputStream = null; DigestInputStream digestInputStream = null; try { // 拿到一个MD5转换器(同样,这里可以换成SHA1) MessageDigest messageDigest =MessageDigest.getInstance("MD5"); // 使用DigestInputStream fileInputStream = new FileInputStream(inputFile); // Base64InputStream base64InputStream=new Base64InputStream(fileInputStream,0); digestInputStream = new DigestInputStream(fileInputStream,messageDigest); // read的过程中进行MD5处理,直到读完文件 byte[] buffer =new byte[bufferSize]; while (digestInputStream.read(buffer) > 0); // 获取最终的MessageDigest messageDigest= digestInputStream.getMessageDigest(); // 拿到结果,也是字节数组,包含16个元素 byte[] resultByteArray = messageDigest.digest(); // 同样,把字节数组转换成字符串 return byteArrayToHex(resultByteArray); } catch (NoSuchAlgorithmException e) { return null; } finally { try { digestInputStream.close(); } catch (Exception e) { } try { fileInputStream.close(); } catch (Exception e) { } } } public static String stringMD5(String input) { try { // 拿到一个MD5转换器(如果想要SHA1参数换成”SHA1”) MessageDigest messageDigest =MessageDigest.getInstance("MD5"); // 输入的字符串转换成字节数组 byte[] inputByteArray = input.getBytes(); // inputByteArray是输入字符串转换得到的字节数组 messageDigest.update(inputByteArray); // 转换并返回结果,也是字节数组,包含16个元素 byte[] resultByteArray = messageDigest.digest(); // 字符数组转换成字符串返回 return byteArrayToHex(resultByteArray); } catch (NoSuchAlgorithmException e) { return null; } } private static String convertToHex(byte[] data) throws IOException { StringBuffer sb = new StringBuffer(); String hex=null; hex= TripleDES.Base64encoding(data, 0); sb.append(hex); return sb.toString(); } //下面这个函数用于将字节数组换成成16进制的字符串 public static String byteArrayToHex(byte[] b) { String hs = ""; String stmp = ""; for (int n = 0; n < b.length; n++) { stmp = (Integer.toHexString(b[n] & 0XFF)); if (stmp.length() == 1) { hs = hs + "0" + stmp; } else { hs = hs + stmp; } if (n < b.length - 1) { hs = hs + ""; } } // return hs.toUpperCase(); return hs; // 首先初始化一个字符数组,用来存放每个16进制字符 /*char[] hexDigits = {'0','1','2','3','4','5','6','7','8','9', 'A','B','C','D','E','F' }; // new一个字符数组,这个就是用来组成结果字符串的(解释一下:一个byte是八位二进制,也就是2位十六进制字符(2的8次方等于16的2次方)) char[] resultCharArray =new char[byteArray.length * 2]; // 遍历字节数组,通过位运算(位运算效率高),转换成字符放到字符数组中去 int index = 0; for (byte b : byteArray) { resultCharArray[index++] = hexDigits[b>>> 4 & 0xf]; resultCharArray[index++] = hexDigits[b& 0xf]; } // 字符数组组合成字符串返回 return new String(resultCharArray);*/ } public static String encodeFileToBase64Binary(String fileName) throws IOException { try { File file = new File(fileName); byte[] bytes = loadFile(file); byte[] encoded = TripleDES.Base64encodingByte(bytes, 0); String encodedString = new String(encoded); return encodedString; } catch (Exception e) { e.printStackTrace(); Logs.e(e, ""); return ""; } } private static byte[] loadFile(File file) throws IOException { InputStream is = new FileInputStream(file); long length = file.length(); if (length > Integer.MAX_VALUE) { // File is too large } byte[] bytes = new byte[(int)length]; int offset = 0; int numRead = 0; while (offset < bytes.length && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) { offset += numRead; } if (offset < bytes.length) { throw new IOException("Could not completely read file "+file.getName()); } is.close(); return bytes; } public static String getMD5EncryptedString(String encTarget){ MessageDigest mdEnc = null; try { mdEnc = MessageDigest.getInstance("MD5"); } catch (NoSuchAlgorithmException e) { System.out.println("Exception while encrypting to md5"); e.printStackTrace(); } // Encryption algorithm mdEnc.update(encTarget.getBytes(), 0, encTarget.length()); String md5 = new BigInteger(1, mdEnc.digest()).toString(16); while ( md5.length() < 32 ) { md5 = "0"+md5; } return md5; } public static boolean checkMD5(String md5, File updateFile) { if (TextUtils.isEmpty(md5) || updateFile == null) { return false; } String calculatedDigest = calculateMD5(updateFile); if (calculatedDigest == null) { return false; } return calculatedDigest.equalsIgnoreCase(md5); } public static String calculateMD5(File updateFile) { MessageDigest digest; try { digest = MessageDigest.getInstance("MD5"); } catch (NoSuchAlgorithmException e) { Logs.e("Exception while getting digest"); return null; } InputStream is; try { is = new FileInputStream(updateFile); } catch (FileNotFoundException e) { Logs.e("Exception while getting FileInputStream"); return null; } byte[] buffer = new byte[8192]; int read; try { while ((read = is.read(buffer)) > 0) { digest.update(buffer, 0, read); } byte[] md5sum = digest.digest(); BigInteger bigInt = new BigInteger(1, md5sum); String output = bigInt.toString(16); // Fill to 32 chars output = String.format("%32s", output).replace(' ', '0'); return output; } catch (IOException e) { throw new RuntimeException("Unable to process file for MD5", e); } finally { try { is.close(); } catch (IOException e) { Logs.e("Exception on closing MD5 input stream"); } } } }