Java MD5加密原理分析及代码示例

因为MD5的不可逆,因此有的网站会把密码转换MD5,而后存储。可是这种算法并非100%严密的,参考MD5 - 维基百科java

下面就写写MD5在Java中的使用。git

主要分为四步算法

  • 定义一个char数组,存储16进制的基本字符数组

char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8',
        '9', 'A', 'B', 'C', 'D', 'E', 'F' };

其中的英语字符能够大写也能够小写,取决于你要的结果是大写仍是小写。好比网站

123456转换后加密

大写是E10ADC3949BA59ABBE56E057F20F883Espa

小写是e10adc3949ba59abbe56e057f20f883e.net

  • 获取Java中的MD5类,用于把输入的字符进行信息摘要运算,获得一个byte数组。
    code

MessageDigest md = null;
try {
    md = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
    e.printStackTrace();
}
md.reset();
md.update(str.getBytes());

byte[] bArray = md.digest();

这个byte数组是2进制的数据,下一步咱们要把2进制转换成16进制
orm

  • 转换16进制,这一步是关键

protected static char[] encodeHex ( final byte[] data, final char[] toDigits){
    final int len = data.length;
    final char[] out = new char[len << 1];
    for (int i = 0, j = 0; i < len; i++) {
        out[j++] = toDigits[(0xF0 & data[i]) >>> 4];
        out[j++] = toDigits[0x0F & data[i]];
    }
    return out;
}

<< 和 >>> 都是java的位移操做符

在说明以前须要解释一下2进制到16进制的转换,

data[i]的高四位(data[i]>>>4) 和0xF0作 & 运算((0xF0 & data[i]) >>> 4),获得16进制高1位

data[i]的低四位(data[i]) 和0xF0作 & 运算,获得16进制低1位

上面两句获得的值都是0到15,这样就获得toDigits数组的位置对应的字符。

final char[] out = new char[len << 1];

这个语句表示要定义一个输出数组(out[]),长度是须要转换数组(date[])的2倍。

为何要是2倍呢,由于2进制的128位,要对应16进制的32位,一个byte是八位二进制,也就是2位十六进制字符(2的8次方等于16的2次方)

  • 最后一步就是把获得的char数组转换成字符串输出。

下面是完整代码

public static String StringMD5(String str){
    char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8',
            '9', 'A', 'B', 'C', 'D', 'E', 'F' };
    MessageDigest md = null;
    try {
        md = MessageDigest.getInstance("MD5");
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    md.reset();
    md.update(str.getBytes());

    byte[] bArray = md.digest();

    String finalStr = new String(encodeHex(bArray, hexDigits));

    System.out.println("16位大写:" + finalStr.substring(8, 24));
    System.out.println("32位大写:" + finalStr);
    return finalStr;
}
protected static char[] encodeHex ( final byte[] data, final char[] toDigits){
    final int len = data.length;
    final char[] out = new char[len << 1];
    for (int i = 0, j = 0; i < len; i++) {
        out[j++] = toDigits[(0xF0 & data[i]) >>> 4];
        out[j++] = toDigits[0x0F & data[i]];
    }
    return out;
}


补充几点:网上有不少Java中MD5的加密实现,和本文所提内容主要区别就是2进制转换16进制

本文是本身写的2进制转换16进制,网上的大部分是利用了java的方法直接转换的,好比

Integer.toHexString(bt)


因此碰到这些也不要迷惑,只是实现不一样而已。

代码下载地址MD5加密实现

相关文章
相关标签/搜索