轉載請註明出處:http://blog.csdn.net/qq_32059827/article/details/52200008 點擊打開連接
html
以前寫過一篇博文,是針對字符串進行md5加密的。今天對其進行改進,加入針對某個文件,進行md5加密,並獲取加密後的值。並把兩個功能封裝成了工具類,若是有須要這個算法的,可直接使用。java
直接上算法封裝的工具類代碼:算法
package com.itydl.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; /** * 針對字符串作的md5加密,以及涉及md5操做的工具類 * @author lenovo * */ public class Md5Utils { /** * 返回文件的md5值 * @param path * 要加密的文件的路徑 * @return * 文件的md5值 */ public static String getFileMD5(String path){ StringBuilder sb = new StringBuilder(); try { FileInputStream fis = new FileInputStream(new File(path)); //獲取MD5加密器 MessageDigest md = MessageDigest.getInstance("md5"); //相似讀取文件 byte[] bytes = new byte[10240];//一次讀取寫入10k int len = 0; while((len = fis.read(bytes))!=-1){//從原目的地讀取數據 //把數據寫到md加密器,類比fos.write(bytes, 0, len); md.update(bytes, 0, len); } //讀完整個文件數據,並寫到md加密器中 byte[] digest = md.digest();//完成加密,獲得md5值,可是是byte類型的。還要作最後的轉換 for (byte b : digest) {//遍歷字節,把每一個字節拼接起來 //把每一個字節轉換成16進制數 int d = b & 0xff;//只保留後兩位數 String herString = Integer.toHexString(d);//把int類型數據轉爲16進制字符串表示 //若是隻有一位,則在前面補0.讓其也是兩位 if(herString.length()==1){//字節高4位爲0 herString = "0"+herString;//拼接字符串,拼成兩位表示 } sb.append(herString); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return sb.toString(); } /** * 對傳遞過來的字符串進行md5加密 * @param str * 待加密的字符串 * @return * 字符串Md5加密後的結果 */ public static String md5(String str){ StringBuilder sb = new StringBuilder();//字符串容器 try { //獲取md5加密器.public static MessageDigest getInstance(String algorithm)返回實現指定摘要算法的 MessageDigest 對象。 MessageDigest md = MessageDigest.getInstance("MD5"); byte[] bytes = str.getBytes();//把要加密的字符串轉換成字節數組 byte[] digest = md.digest(bytes);//使用指定的 【byte 數組】對摘要進行最後更新,而後完成摘要計算。即完成md5的加密 for (byte b : digest) { //把每一個字節轉換成16進制數 int d = b & 0xff;//只保留後兩位數 String herString = Integer.toHexString(d);//把int類型數據轉爲16進制字符串表示 //若是隻有一位,則在前面補0.讓其也是兩位 if(herString.length()==1){//字節高4位爲0 herString = "0"+herString;//拼接字符串,拼成兩位表示 } sb.append(herString); } } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } return sb.toString(); } }