package com.wgcloud.util; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; /** * @version v3.3 * @ClassName:MD5Utils.java * @author: http://www.wgstart.com * @date: 2021年1月16日 * @Description: Md5加密处理 * @Copyright: 2019-2021 wgcloud. All rights reserved. */ @SuppressWarnings("unused") public class MD5Utils { private static final Logger logger = LoggerFactory.getLogger(MD5Utils.class); // 全局数组 private final static String[] strDigits = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"}; /** * 16进制字符 */ private final static char hexdigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; /** * 对文件全文生成MD5摘要 * * @param file 要加密的文件 * @return MD5摘要码 */ public static String getMD5ForFile(String filePath) { FileInputStream fis = null; MessageDigest md = null; try { md = MessageDigest.getInstance("MD5"); File file = new File(filePath); if (!file.exists()) { return ""; } fis = new FileInputStream(file); byte[] buffer = new byte[4096]; int length = -1; while ((length = fis.read(buffer)) != -1) { md.update(buffer, 0, length); } byte[] b = md.digest(); return byteToHexString(b); } catch (Exception ex) { logger.error("获取MD5信息发生异常!" + ex.toString()); return null; } finally { try { if (null != fis) { fis.close(); } } catch (IOException e) { logger.error("获取MD5信息发生异常!" + e.toString()); } } } /** * 把byte[]数组转换成十六进制字符串表示形式 * * @param tmp 要转换的byte[] * @return 十六进制字符串表示形式 */ private static String byteToHexString(byte[] tmp) { String s; char str[] = new char[16 * 2]; int k = 0; for (int i = 0; i < 16; i++) { byte byte0 = tmp[i]; str[k++] = hexdigits[byte0 >>> 4 & 0xf]; str[k++] = hexdigits[byte0 & 0xf]; } s = new String(str); return s; } // 返回形式为数字跟字符串 private static String byteToArrayString(byte bByte) { int iRet = bByte; // System.out.println("iRet="+iRet); if (iRet < 0) { iRet += 256; } int iD1 = iRet / 16; int iD2 = iRet % 16; return strDigits[iD1] + strDigits[iD2]; } // 返回形式只为数字 private static String byteToNum(byte bByte) { int iRet = bByte; System.out.println("iRet1=" + iRet); if (iRet < 0) { iRet += 256; } return String.valueOf(iRet); } // 转换字节数组为16进制字串 private static String byteToString(byte[] bByte) { StringBuffer sBuffer = new StringBuffer(); for (int i = 0; i < bByte.length; i++) { sBuffer.append(byteToArrayString(bByte[i])); } return sBuffer.toString(); } /** * 返回md5小写字符串 * @param strObj * @return */ public static String GetMD5Code(String strObj) { if (StringUtils.isEmpty(strObj)) { return ""; } String resultString = null; try { resultString = new String(strObj); MessageDigest md = MessageDigest.getInstance("MD5"); // md.digest() 该函数返回值为存放哈希值结果的byte数组 resultString = byteToString(md.digest(strObj.getBytes())); } catch (NoSuchAlgorithmException ex) { ex.printStackTrace(); } return resultString; } }