MD5加密(校验)工具类代码

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.channels.FileChannel;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * @Title: MD5Util.java
 * @Description: MD5工具类,提供字符串MD5加密(校验)、文件MD5值获取(校验)功能
 * @Created on 2015-05-28 上午00:00:00
 * @author mazh
 * @version $Revision: 1.0 $
 */
public class Utilmd5 {
    /**
     * 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 MessageDigest messageDigest = null;

    /**
     * 初始化messageDigest的加密算法为MD5
     */
    private Utilmd5() {
        try {
            this.messageDigest = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException e) {
            // TODO error handle
            e.printStackTrace();
        }
    }
    public static Utilmd5 New(){
        return new Utilmd5();
    }

    /**
     * 获取文件的MD5值
     * 
     * @param file
     *            目标文件
     * @return MD5字符串
     */
    public String getFileMD5String(File file) {
        String ret = "";
        FileInputStream in = null;
        FileChannel ch = null;

        try {
            in = new FileInputStream(file);
            byte[] buffer = new byte[2048];
            int length = -1;
            while ((length = in.read(buffer)) != -1) {
                messageDigest.update(buffer, 0, length);
            }
            ret = bytesToHex(messageDigest.digest()).substring(8, 24);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if (ch != null) {
                try {
                    ch.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        return ret;
    }

    /**
     * 获取文件的MD5值
     * 
     * @param fileName
     *            目标文件的完整名称
     * @return MD5字符串
     */
    public String getFileMD5String(String fileName) {
        return getFileMD5String(new File(fileName));
    }

    /**
     * MD5加密字符串
     * 
     * @param str
     *            目标字符串
     * @return MD5加密后的字符串
     */
    public String getMD5String(String str) {
        return getMD5String(str.getBytes());
    }

    /**
     * MD5加密以byte数组表示的字符串
     * 
     * @param bytes
     *            目标byte数组
     * @return MD5加密后的字符串
     */
    public String getMD5String(byte[] bytes) {
        messageDigest.update(bytes);
        return bytesToHex(messageDigest.digest());
    }
    /**
     * MD5加密以byte数组表示的字符串
     * 
     * @param bytes
     *            目标byte数组
     * @return MD5加密后的字符串
     */
    public byte[] getMD5Bytes(byte[] bytes) {
    	messageDigest.update(bytes);
    	return messageDigest.digest();
    }

    /**
     * 校验密码与其MD5是否一致
     * 
     * @param pwd
     *            密码字符串
     * @param md5
     *            基准MD5值
     * @return 检验结果
     */
    public boolean checkPassword(String pwd, String md5) {
        return getMD5String(pwd).equalsIgnoreCase(md5);
    }

    /**
     * 校验密码与其MD5是否一致
     * 
     * @param pwd
     *            以字符数组表示的密码
     * @param md5
     *            基准MD5值
     * @return 检验结果
     */
    public boolean checkPassword(char[] pwd, String md5) {
        return checkPassword(new String(pwd), md5);
    }

    /**
     * 检验文件的MD5值
     * 
     * @param file
     *            目标文件
     * @param md5
     *            基准MD5值
     * @return 检验结果
     */
    public boolean checkFileMD5(File file, String md5) {
        return getFileMD5String(file).equalsIgnoreCase(md5);
    }

    /**
     * 检验文件的MD5值
     * 
     * @param fileName
     *            目标文件的完整名称
     * @param md5
     *            基准MD5值
     * @return 检验结果
     */
    public boolean checkFileMD5(String fileName, String md5) {
        return checkFileMD5(new File(fileName), md5);
    }
    /**
     * 不关闭stream
     * @param in
     * @return
     */
    public String getStreamMD5String(InputStream in) {
    	String ret = "";
    	
    	try {
    		byte[] buffer = new byte[2048];
    		int length = -1;
    		while ((length = in.read(buffer)) != -1) {
    			messageDigest.update(buffer, 0, length);
    		}
    		ret = bytesToHex(messageDigest.digest()).substring(8, 24);
    	} catch (IOException e) {
    		e.printStackTrace();
    		throw new RuntimeException(e);
    	} finally {
//    		if (in != null) {
//    			try {
//    				in.close();
//    			} catch (IOException e) {
//    				e.printStackTrace();
//    			}
//    		}
    	}
    	
    	return ret;
    }

    /**
     * 将字节数组转换成16进制字符串
     * 
     * @param bytes
     *            目标字节数组
     * @return 转换结果
     */
    public String bytesToHex(byte bytes[]) {
        return bytesToHex(bytes, 0, bytes.length);
    }

    /**
     * 将字节数组中指定区间的子数组转换成16进制字符串
     * 
     * @param bytes
     *            目标字节数组
     * @param start
     *            起始位置(包括该位置)
     * @param end
     *            结束位置(不包括该位置)
     * @return 转换结果
     */
    public String bytesToHex(byte bytes[], int start, int end) {
        StringBuffer sb = new StringBuffer();

        for (int i = start; i < start + end; i++) {
            sb.append(byteToHex(bytes[i]));
        }

        return sb.toString();
    }

    /**
     * 将单个字节码转换成16进制字符串
     * 
     * @param bt
     *            目标字节
     * @return 转换结果
     */
    public String byteToHex(byte bt) {
        return HEX_DIGITS[(bt & 0xf0) >> 4] + "" + HEX_DIGITS[bt & 0xf];
    }

    public static void main(String[] args) throws IOException {
        Utilmd5 m = new Utilmd5();
        System.out.println(m.getMD5String("a"));
    }
}

你可能感兴趣的:(MD5加密)