MD5算法

就是将已知的明文密码转换成固定长度的MD5

MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。

MD5算法具有以下特点

1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。
2、容易计算:从原数据计算出MD5值很容易。
3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
4、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。除了MD5以外,其中比较有名的还有sha-1、RIPEMD以及Haval等。

JAVA中的摘要算法简单示例


 

    1. package com.zhuifeng.util;  
    2. import java.security.MessageDigest;    
    3. /** 
    4.  * @author guoxk 
    5.  * 
    6.  * @version 创建时间 2016年1月7日 下午1:47:06 
    7.  * 
    8.  * 类描述:MD5加密工具类 
    9.  * 
    10.  */  
    11. public class MD5Util{    
    12.     /** 
    13.      * @author guoxk 
    14.      * 
    15.      * 方法描述:MD5加密方法 
    16.      * @param str 明文 
    17.      * @param charSet 字符编码 
    18.      * @return 密文 
    19.      */  
    20.     public  static String MD5(String str,String charSet) {  
    21.         MessageDigest messageDigest = null;    
    22.     try {    
    23.         messageDigest = MessageDigest.getInstance("MD5");    
    24.         messageDigest.reset();   
    25.         if(charSet==null){  
    26.             messageDigest.update(str.getBytes());  
    27.         }else{  
    28.             messageDigest.update(str.getBytes(charSet));    
    29.         }             
    30.     } catch (Exception e) {    
    31.         e.printStackTrace();  
    32.     }   
    33.     byte[] byteArray = messageDigest.digest();    
    34.     StringBuffer md5StrBuff = new StringBuffer();    
    35.     for (int i = 0; i < byteArray.length; i++) {                
    36.         if (Integer.toHexString(0xFF & byteArray[i]).length() == 1)    
    37.             md5StrBuff.append("0").append(Integer.toHexString(0xFF & byteArray[i]));    
    38.         else    
    39.             md5StrBuff.append(Integer.toHexString(0xFF & byteArray[i]));    
    40.     }    
    41.     return md5StrBuff.toString();    
    42.   
    43.     }  
    44.     /** 
    45.      * @author guoxk 
    46.      * 
    47.      * 方法描述:MD5加密方法 --- UTF-8编码 
    48.      * @param s 明文 
    49.      * @return 密文 
    50.      */  
    51.     public  static String MD5(String s) {  
    52.         char hexDigits[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};         
    53.         try {  
    54.             byte[] btInput = s.getBytes("utf-8");  
    55.             // 获得MD5摘要算法的 MessageDigest 对象  
    56.             MessageDigest mdInst = MessageDigest.getInstance("MD5");  
    57.             // 使用指定的字节更新摘要  
    58.             mdInst.update(btInput);  
    59.             // 获得密文  
    60.             byte[] md = mdInst.digest();  
    61.             // 把密文转换成十六进制的字符串形式  
    62.             int j = md.length;  
    63.             char str[] = new char[j * 2];  
    64.             int k = 0;  
    65.             for (int i = 0; i < j; i++) {  
    66.                 byte byte0 = md[i];  
    67.                 str[k++] = hexDigits[byte0 >>> 4 & 0xf];  
    68.                 str[k++] = hexDigits[byte0 & 0xf];  
    69.             }  
    70.             return new String(str);  
    71.         } catch (Exception e) {  
    72.             e.printStackTrace();  
    73.             return null;  
    74.         }  
    75.     }  
    76.     public static void main(String[] args) {  
    77.     String password = "ming wen mi ma";  
    78.     System.out.println("原明文:" + password);  
    79.     String pw = MD5(password);//默认utf-8编码加密,32位大写,  
    80.     System.out.println("32位大写UTF-8加密后:" + pw);//C0389AC882DFCCA5592628F139F7A975  
    81.     String pw2 = MD5(password,"GBK");//自定义编码加密,32位小写  
    82.     System.out.println("32位小写自定义编码加密后:" + pw2);//c0389ac882dfcca5592628f139f7a975  
    83.     }  
    84. }
posted @ 2017-10-23 10:53  天天搬砖的IT小漂  阅读(462)  评论(0编辑  收藏  举报