1. 程式人生 > >MD5/SHA1加密檔案

MD5/SHA1加密檔案

import java.io.FileInputStream;
import java.io.IOException;
import java.security.DigestInputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * @version 1.0
 * @description
 */
public class Md5Util {

    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;
    protected static String convert="MD5";

    static{
        try{
            // 拿到一個MD5轉換器(如果想要SHA1引數換成”SHA1”)
            messageDigest = MessageDigest.getInstance(convert);
        }catch (NoSuchAlgorithmException e) {
            System.err.println(Md5Util.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];
            byte[] resultByteArray =null;
            while (digestInputStream.read(buffer) > 0) {
                // 獲取最終的MessageDigest
                messageDigest= digestInputStream.getMessageDigest();
                // 拿到結果,也是位元組陣列,包含16個元素
                resultByteArray= messageDigest.digest();
                // 同樣,把位元組陣列轉換成字串
            }
            return bufferToHex(resultByteArray);
        } finally {
            try {
                digestInputStream.close();
            } catch (Exception e) {
            }
            try {
                fileInputStream.close();
            } catch (Exception e) {
            }
        }
    }

}