Md5加密

Md5消息摘要

以下是实现md5加密

package com.eminen.util;

import java.security.MessageDigest;

public class Md5Util {

    public static String str2Md5(String str) throws Exception {

        MessageDigest md = null;
        md = MessageDigest.getInstance("MD5");

        // 把字符串转byte数组进行消息摘要计算。得到一个byte数组
        md.reset();
        md.update(str.getBytes());
        byte[] byteArr = md.digest();

        // 或者简单用
        // byteArr = md.digest(str.getBytes());

        // 二进制 0-1----》转16进制 0-F
        char[] hexArr = encodeHex(byteArr);

        // 把字符数组编程字符串
        String finalStr = new String(hexArr);

        System.out.println("16位大写:" + finalStr.substring(8, 24));
        System.out.println("32位大写:" + finalStr);
        return finalStr;
    }

    // 主要代码:byte数组转为16进制字符数组
    private static char[] encodeHex(byte[] byteArr) {
        int len = byteArr.length;
        // len = 16(10进制) = 10000 左移1位 100000 =32(10进制)
        char[] out = new char[len << 1];
        for (int i = 0, j = 0; i < len; i++) {
            // 一个byte有8bit=1111,1111,每4个bit就是0-F.所以一个byte就是两个16进制
            // 获取高4位就要 把低四位的移走,就要把这8bit往右边移动4位,再与0x0f运算,得到16进制高1位
            // 获取低4位就直接与0x0f = 0000,1111进行与运算后,高位与0运算后都是0.低位与1运算后,有0为0。都1才1。得到16进制低1位
            // 比如 24的8bit = 00011000 = 0001,1000 = 1,8
            int hi = (byteArr[i] >> 4) & 0x0f;
            int lo = byteArr[i] & 0x0f;
            // 再把10进制转为16进制.forDigit返回的是int,再转为char
            // 'a'=97,b=98..... ('a'-10)=87+(》=10的)97以上的就是字符a开始算了
            out[j++] = Character.forDigit(hi, 16);
            out[j++] = Character.forDigit(lo, 16);
        }
        return out;
    }

    public static void main(String[] args) throws Exception {
        String str = "ab";
        Md5Util.str2Md5(str);
    }
}

 

参考资料:

1.http://my.oschina.net/u/2519530/blog/536372

posted @ 2016-09-12 14:05  倔强的鸭子  阅读(125)  评论(0编辑  收藏  举报