Java實現MD5加密,具體代碼如下:
package com.bstek.tools; import java.io.FileInputStream; import java.io.IOException; import java.security.DigestInputStream; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; /** * Md5 * 提供對字符串的md5-->stringMD5 * 提供對文件的Md5-->fileMD5 * * 對於大文件,可以使用DigestInputStream */ public class Md5Utils { protected static char hexDigits[] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}; protected static MessageDigest messageDigest = null; static{ try{ // 拿到一個MD5轉換器(如果想要SHA1參數換成”SHA1”) messageDigest = MessageDigest.getInstance("MD5"); }catch (NoSuchAlgorithmException e) { System.err.println(Md5Utils.class.getName()+"初始化失敗,MessageDigest不支持MD5Util."); e.printStackTrace(); } } 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]; char c1 = hexDigits[bt & 0xf]; stringbuffer.append(c0); stringbuffer.append(c1); } private static String bufferToHex(byte bytes[]) { return bufferToHex(bytes, 0, bytes.length); } /** * 字符串的md5加密 * @param input * @return */ public static String stringMD5(String input) { // 輸入的字符串轉換成字節數組 byte[] inputByteArray = input.getBytes(); // inputByteArray是輸入字符串轉換得到的字節數組 messageDigest.update(inputByteArray); // 轉換並返回結果,也是字節數組,包含16個元素 byte[] resultByteArray = messageDigest.digest(); // 字符數組轉換成字符串返回 return bufferToHex(resultByteArray); } /** * 文件的md5加密 * @param inputFile * @return * @throws IOException */ public static String fileMD5(String inputFile) throws IOException { // 緩沖區大小(這個可以抽出一個參數) int bufferSize = 256 * 1024; FileInputStream fileInputStream = null; DigestInputStream digestInputStream = null; try { // 使用DigestInputStream fileInputStream = new FileInputStream(inputFile); 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 bufferToHex(resultByteArray); } finally { try { digestInputStream.close(); } catch (Exception e) { } try { fileInputStream.close(); } catch (Exception e) { } } } /** * @param args */ public static void main(String[] args) { //測試字符串MD5加密 //123456: e10adc3949ba59abbe56e057f20f883e //eastcom: 6997c46956185a7c4d452646fc9c69e2 System.out.println(stringMD5("eastcom")); try { long startTime = System.currentTimeMillis(); //測試文件MD5加密 String FilePath = "D:/ilink_ide.zip"; //4227e9fc4bd71ff34887d47867967b29 System.out.println(fileMD5(FilePath)); long endTime = System.currentTimeMillis(); System.out.println((endTime - startTime)/1000); } catch (IOException e) { e.printStackTrace(); } } /** * 參考文章: * http://www.zhihu.com/question/23702510 * http://blog.csdn.net/lf_software_studio/article/details/8025497 * http://my.oschina.net/laigous/blog/106646 * http://blog.csdn.net/wangqiuyun/article/details/22941433 */ }
轉載請注明出處...
