MD5工具類,提供字符串MD5加密(校驗)、文件MD5值獲取(校驗)功能 :java
package com.yzu.utils; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import org.apache.commons.io.IOUtils; /** * MD5工具類,提供字符串MD5加密(校驗)、文件MD5值獲取(校驗)功能 */ public class MD5Utils { /** * 16進制字符集 */ private static final char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; /** * 指定算法爲MD5的MessageDigest */ private static MessageDigest messageDigest = null; /** * 初始化messageDigest的加密算法爲MD5 */ static { try { messageDigest = MessageDigest.getInstance("MD5"); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } } /** * 獲取文件的MD5值 * * @param file * 目標文件 * @return MD5字符串 */ public static String getFileMD5String(File file) { String ret = ""; FileInputStream in = null; FileChannel ch = null; try { in = new FileInputStream(file); ch = in.getChannel(); ByteBuffer byteBuffer = ch.map(FileChannel.MapMode.READ_ONLY, 0, file.length()); messageDigest.update(byteBuffer); ret = bytesToHex(messageDigest.digest()); } catch (IOException e) { e.printStackTrace(); } finally { IOUtils.closeQuietly(ch, in); } return ret; } /** * * 獲取文件的MD5值 * * @param fileName * 目標文件的完整名稱 * @return MD5字符串 */ public static String getFileMD5String(String fileName) { return getFileMD5String(new File(fileName)); } /** * * MD5加密字符串 * * @param str * 目標字符串 * @return MD5加密後的字符串 */ public static String getMD5String(String str) { return getMD5String(str.getBytes()); } /** * * MD5加密以byte數組表示的字符串 * * @param bytes * 目標byte數組 * @return MD5加密後的字符串 */ public static String getMD5String(byte[] bytes) { messageDigest.update(bytes); return bytesToHex(messageDigest.digest()); } /** * * 校驗密碼與其MD5是否一致 * * @param pwd * 密碼字符串 * @param md5 * 基準MD5值 * @return 檢驗結果 */ public static boolean checkPassword(String pwd, String md5) { return getMD5String(pwd).equalsIgnoreCase(md5); } /** * * 校驗密碼與其MD5是否一致 * * @param pwd * 以字符數組表示的密碼 * @param md5 * 基準MD5值 * @return 檢驗結果 */ public static boolean checkPassword(char[] pwd, String md5) { return checkPassword(new String(pwd), md5); } /** * * 檢驗文件的MD5值 * * @param file * 目標文件 * * @param md5 * 基準MD5值 * * @return 檢驗結果 * */ public static boolean checkFileMD5(File file, String md5) { return getFileMD5String(file).equalsIgnoreCase(md5); } /** * * 檢驗文件的MD5值 * * @param fileName * 目標文件的完整名稱 * * @param md5 * 基準MD5值 * * @return 檢驗結果 * */ public static boolean checkFileMD5(String fileName, String md5) { return checkFileMD5(new File(fileName), md5); } /** * * 將字節數組轉換成16進制字符串 * * @param bytes * 目標字節數組 * * @return 轉換結果 * */ public static String bytesToHex(byte bytes[]) { return bytesToHex(bytes, 0, bytes.length); } /** * * 將字節數組中指定區間的子數組轉換成16進制字符串 * * @param bytes * 目標字節數組 * * @param start * 起始位置(包括該位置) * * @param end * 結束位置(不包括該位置) * @return 轉換結果 * */ public static String bytesToHex(byte bytes[], int start, int end) { StringBuilder sb = new StringBuilder(); for (int i = start; i < start + end; i++) { sb.append(byteToHex(bytes[i])); } return sb.toString(); } /** * 雙層加密的MD5值 * @param strSrc */ public static String getSimenMD5(String strSrc) { String str1 = getMD5String(strSrc).toLowerCase(); StringBuffer str2 = new StringBuffer(""); str2.append(str1.substring(0, 2)).append("|") .append(str1.substring(4, 10)).append("|") .append(str1.substring(8, 21)).append("|") .append(str1.substring(14, 19)).append("|") .append(str1.substring(1, 9)).append("|") .append(str1.substring(24, 27)); return getMD5String(str2.toString()); } /** * 將單個字節碼轉換成16進制字符串 * @param bt * 目標字節 * @return 轉換結果 */ public static String byteToHex(byte bt) { return HEX_DIGITS[(bt & 0xf0) >> 4] + "" + HEX_DIGITS[bt & 0xf]; } public static void main(String[] args) throws IOException { String fileName = "D:/javawed/debug.js"; String md5 = getFileMD5String(new File(fileName)); System.out.println(fileName+"文件MD5: "+md5); System.out.println(getSimenMD5("123456")); } }