MD5算法细节及应用

MD5信息摘要算法

特点:

MD5是一种极具代表性的哈希算法,主要特点是其单方向性,你可以将明文信息通过MD5映射成密文信息,但是无法通过解密密文来获取明文信息。MD5作为不可逆的加密算法,只能加密,不能解密,而且目前为止技术上逆运算的程序并没有被开发出来。因此,这类算法对于信息传递来说基本没有什么用处,但是,正因为它的不可逆性,使得它十分适合用于身份认证与数字签名这方面,可以防止信息被修改。而且MD5有一个极大的优势,它不会随着明文长度的增加导致密文长度随之增加,无论需要加密的信息多长,加密之后是一段唯一的固定长度128bit的密文字符。

内部流程:

在MD5加密算法中,第一步对信息进行填充,使其字节长度达到(N+1)*512bit的要求。其次,有4个32bit被叫做链接变量的A,B,C,D,这四个变量初值赋值给a,b,c,d好了后,进行N+1次大循环,每一次大循环中包括四轮迭代运算,每一轮又包括16次不同参数的运算,每次运算都是对a、b、c、d中的3个进行非线性函数运算,将得到的结果加进行加法运算,加数包括未参与运算的第4个变量,512bit明文的某个32bit分组和一个常数。再将所得结果向右环移一个不定的数,再加上a,b,c,d中之一,将此结果赋值给a,b,c,d中之一。在四轮循环结束后,将A,B,C,D分别加上a,b,c,d,再用下一组512bit明文继续运行该算法,直至最后输出的是A,B,C,D的级联,所以无论明文多长,所得密文都是128bit。具体内部算法流程图如下:

MD5算法细节及应用_第1张图片

 信息填充:实际填充至N*512+448bit,在原始信息后添加一个1和无数个0使其达到要求,再用64bit记录原始信息的长度,所以共计(N+1)*512bit。

初始链接变量A=0x01234567,B=0x89abcdef,C=0xfedcba98,D=0x76543210。其中,FF,GG,HH,II运算类型相同,具体内部相关运算存在差异。例如,FF(a,b,c,d,Mj,s,ti)表示a=b+((a+(F(b,c,d)+Mj+ti))<

调用加密函数:

//用于账户密码MD5加密
public static String MD5_encrypt(String content) throws Exception {
    MessageDigest md5=MessageDigest.getInstance("MD5");
    byte[] srcBytes=content.getBytes("utf-8"); 
    byte[] resultBytes = md5.digest(srcBytes);
    	
    //字节数组转String时密文字母小写
    StringBuilder hex = new StringBuilder(resultBytes.length * 2);  
    for (byte b : resultBytes) {  
        if ((b & 0xFF) < 0x10) hex.append("0");  
        hex.append(Integer.toHexString(b & 0xFF));  
    }  
    return hex.toString();  
}

缺陷及措施:

由于MD5的一一映射这个特性,所以非法用户可以写程序通过跑字典的方式进行破解。

降低破解措施:

  1. 设计更加复杂的待加密信息(一般是密码)。
  2. 多次MD5映射处理,即经过MD5算法处理后的128bit密文再次进行MD5处理。
  3. MD5加盐处理,不把信息直接进行MD5处理,而是先加个salt。

 

 

 

 

 

你可能感兴趣的:(加密算法,算法)