zoukankan      html  css  js  c++  java
  • MD5加密

    MD5算法是典型的消息摘要算法,其前身有MD2、MD3和MD4算法,它由MD4、MD3和MD2算法改进而来。不论是哪一种MD算法,它们都需要获得一个随机长度的信息并产生一个123位的信息摘要。如果将这个128位的二进制摘要信息换算成十六进制,可以得到一个32位的字符串,故我们见到的大部分MD5算法的数字指纹都是32为十六进制的字符串。

    MD算法家族的发展史:

    MD2算法:

    1989年,著名的非对称算法RSA发明人之一----麻省理工学院教授罗纳德.李维斯特开发了MD2算法。这个算法首先对信息进行数据补位,使信息的字节长度是16的倍数。再以一个16位的检验和做为补充信息追加到原信息的末尾。最后根据这个新产生的信息计算出一个128位的散列值,MD2算法由此诞生。

    MD4算法:

    1990年,罗纳德.李维斯特教授开发出较之MD2算法有着更高安全性的MD4算法。在这个算法中,我们仍需对信息进行数据补位。不同的是,这种补位使其信息的字节长度加上448个字节后成为512的倍数(信息字节长度mod 512 =448)。此外,关于MD4算的处理和MD2算法有很大的差别。但最终仍旧会获得一个128为的散列值。MD4算法对后续消息摘要算法起到了推动作用,许多比较有名的消息摘要算法都是在MD4算法的基础上发展而来的,如MD5、SHA-1、RIPE-MD和HAVAL算法等。

    MD5算法:

    1991年,继MD4算法后,罗纳德.李维斯特教授开发了MD5算法,将MD算法推向成熟。MD5算法经MD2、MD3和MD4算法发展而来,算法复杂程度和安全强度打打提高,但浙西MD算法的最终结果都是产生一个128位的信息摘要。这也是MD系列算法的特点。

    一、java提供的MD2和MD5算法应用

    1. package com.tao.test;  
    2.   
    3. import java.io.UnsupportedEncodingException;  
    4. import java.security.MessageDigest;  
    5.   
    6. import javax.xml.bind.annotation.adapters.HexBinaryAdapter;  
    7.   
    8.   
    9. /** 
    10.  * MD加密工具类 
    11.  */  
    12. class MDCoder {  
    13.     // MD2加密   
    14.     public static String encodeMd2(byte[] data) throws Exception {  
    15.         // 初始化MessageDigest   
    16.         MessageDigest md = MessageDigest.getInstance("MD2");  
    17.         // 执行摘要信息   
    18.         byte[] digest = md.digest(data);  
    19.         // 将摘要信息转换为32位的十六进制字符串   
    20.         return new String(new HexBinaryAdapter().marshal(digest));  
    21.     }  
    22.   
    23.     // MD5加密   
    24.     public static String encodeMd5(byte[] data) throws Exception {  
    25.         // 初始化MessageDigest   
    26.         MessageDigest md = MessageDigest.getInstance("MD5");  
    27.         // 执行摘要信息   
    28.         byte[] digest = md.digest(data);  
    29.         // 将摘要信息转换为32位的十六进制字符串   
    30.         return new String(new HexBinaryAdapter().marshal(digest));  
    31.     }  
    32. }  
    33.   
    34. public class MDTest {  
    35.     public static void main(String[] args) throws UnsupportedEncodingException, Exception {  
    36.         String testString = "123456asdasdfsdfsdfsdf";  
    37.         System.out.println(MDCoder.encodeMd2(testString.getBytes()));  
    38.         System.out.println(MDCoder.encodeMd5(testString.getBytes()));  
    39.     }  
    40. }  

    二、BouncyCastle补充的MD4算法的应用

    1. package Test;  
    2.   
    3. import java.io.UnsupportedEncodingException;  
    4. import java.security.MessageDigest;  
    5. import java.security.Security;  
    6.   
    7. import org.bouncycastle.jce.provider.BouncyCastleProvider;  
    8. import org.bouncycastle.util.encoders.Hex;  
    9.   
    10. /** 
    11.  * MD加密工具类 
    12.  */  
    13. class MDCoder {  
    14.     // MD2加密   
    15.     public static String encodeMd4(byte[] data) throws Exception {  
    16.         //加入BouncyCastle的支持   
    17.         Security.addProvider(new BouncyCastleProvider());  
    18.         // 初始化MessageDigest   
    19.         MessageDigest md = MessageDigest.getInstance("MD4");  
    20.         //执行摘要信息   
    21.         byte[] digest=md.digest(data);  
    22.         //将摘要信息转换为32位的十六进制字符串   
    23.         return new String(Hex.encode(digest));  
    24.     }  
    25. }  
    26.   
    27. public class MDTest {  
    28.     public static void main(String[] args) throws UnsupportedEncodingException, Exception {  
    29.         String testString="123456asdasdfsdfsdfsdf";  
    30.         String digestString=MDCoder.encodeMd4(testString.getBytes());  
    31.         System.out.println(digestString);  
    32.     }  
    33. }  
    
    

    三、Commons Codec提供的实现

    Commons Codec提供了消息摘要的工具类-----DigestUtils类。DigestUtils类是对Sun提供的MessageDigest类的一次封装,提供了MD5和SHA系列消息摘要算法的实现。

    1. package Test;  
    2.   
    3. import java.io.UnsupportedEncodingException;  
    4.   
    5. import org.apache.commons.codec.binary.Hex;  
    6. import org.apache.commons.codec.digest.DigestUtils;  
    7.   
    8. /** 
    9.  * MD加密工具类 
    10.  */  
    11. class MDCoder {  
    12.     // MD5加密 返回十六进制的字符串   
    13.     public static String encodeMd5Hex(byte[] data) throws Exception {  
    14.         return DigestUtils.md5Hex(data);  
    15.     }  
    16.   
    17.     // MD5加密,返回十进制的字节数组   
    18.     public static byte[] encodeMd5(byte[] data) {  
    19.         return DigestUtils.md5(data);  
    20.     }  
    21. }  
    22.   
    23. public class MDTest {  
    24.     public static void main(String[] args) throws UnsupportedEncodingException, Exception {  
    25.         String testString = "123456asdasdfsdfsdfsdf";  
    26.         //十六进制的字符串   
    27.         String digestString = MDCoder.encodeMd5Hex(testString.getBytes());  
    28.         System.out.println(digestString);  
    29.           
    30.         //字节数组   
    31.         byte[] digest=MDCoder.encodeMd5(testString.getBytes());  
    32.         String dString=new String(Hex.encodeHex(digest));  
    33.         System.out.println(dString);  
    34.     }  

    实际应用中根据自己的选择用选择不同的方法来实现MD消息摘要算法

    使用DigestUtils实现MD5加密最简单粗暴的方法:

    导入包 commons-codec-1.4.jar

    DigestUtils.md5Hex(str);//这样会得到一个加密后的字符串

    over

    在线解密地址:http://www.cmd5.com/

    原文:http://blog.csdn.net/lonelyroamer/article/details/7652320

  • 相关阅读:
    {Notes}{Latex}{multirow}
    [Reship] Mean Shift 算法介绍
    {Notes}{LaTeX}{enumerate}
    This is a test.
    js中的执行环境和作用域链
    js的预解析
    js笔试题一套(未完待续)
    使用setTimeout 来实现setInterval的效果
    ie6 ie7下报脚本错误"Expected identifier, string or number" 的原因和解决方法
    【雕爷学编程】Arduino动手做(63)---TCS3200D颜色识别传感器
  • 原文地址:https://www.cnblogs.com/Jenny-sider/p/4305382.html
Copyright © 2011-2022 走看看