java.security.MessageDigest

 MD5是常用的加密方法,这里主要讲述JDK中的java.security.MessageDigest加密方式!

 

  
  
  
  
  1. private static final String keyMap = "C2E8D9A3B5F14648"
  2.     public static String getMD5(byte[] bytes) throws Exception { 
  3.         java.security.MessageDigest md = java.security.MessageDigest 
  4.                 .getInstance("MD5"); 
  5.         md.update(bytes); 
  6.         byte bt, tmp[] = md.digest(); 
  7.         char str[] = new char[32]; 
  8.         int k = 0
  9.         for (int i = 0; i < 16; i++) { 
  10.             bt = tmp[i]; 
  11.             str[k++] = keyMap.charAt(bt >>> 4 & 0xf); 
  12.             str[k++] = keyMap.charAt(bt & 0xf); 
  13.         } 
  14.         return new String(str); 
  15.     } 

 

下面是测试方法:

 

  
  
  
  
  1. public static void main(String[] args) { 
  2.     byte[] b = "pengfei".getBytes(); 
  3.     try { 
  4.         String s = getMD5(b); 
  5.         System.out.println(s); 
  6.     } catch (Exception e) { 
  7.         // TODO Auto-generated catch block 
  8.         e.printStackTrace(); 
  9.     } 
  10.      

控制台输出的结果为:

 

  
  
  
  
  1. DF14ED4F2FD8264EC6E949EFF281AAF3 

 

输出的是byte[](messageDigest.digest()得到的是个二进制byte数组,有可能某些byte是不可打印的字符。)...我们可以使用Base64来处理byte[];

 

  
  
  
  
  1. @Test 
  2.     public void testMD() { 
  3.         try {            
  4.             String username = "pengfei"
  5.             MessageDigest messageDigest = MessageDigest.getInstance("MD5"); 
  6.             messageDigest.update(username.getBytes()); 
  7.             System.out.println(Base64.encode(messageDigest.digest())); 
  8.         } catch (Exception e) { 
  9.             e.printStackTrace(); 
  10.         } 
  11.     } 

当然我们可以编写函数,处理二进制转hex字符串.

 

  
  
  
  
  1. /** 
  2.      * 将16位byte[] 转换为32位String 
  3.      *  
  4.      * @param buffer 
  5.      * @return 
  6.      */ 
  7.     private String toHex(byte buffer[]) { 
  8.         StringBuffer sb = new StringBuffer(buffer.length * 2); 
  9.         for (int i = 0; i < buffer.length; i++) { 
  10.             sb.append(Character.forDigit((buffer[i] & 240) >> 416)); 
  11.             sb.append(Character.forDigit(buffer[i] & 1516)); 
  12.         } 
  13.  
  14.         return sb.toString(); 
  15.     } 

测试代码如下:

 

  
  
  
  
  1. @Test 
  2.     public void testMD() { 
  3.         try { 
  4.              
  5.             String username = "pengfei"
  6.             MessageDigest messageDigest = MessageDigest.getInstance("MD5"); 
  7.             messageDigest.update(username.getBytes()); 
  8.             System.out.println(toHex(messageDigest.digest())); 
  9.         } catch (Exception e) { 
  10.             e.printStackTrace(); 
  11.         } 
  12.     } 

 

输出结果: 

  
  
  
  
  1. 打印:020c290593cef84aeac4ea2c269d326d,返回的是32位的字符串!!! 

这样我们便可以直接使用JDK为我们提供的加密类与函数了!

 

MessageDigest不仅仅只为我们提供了"MD5"加密,还提供了"SHA-1"

创建的方法只为: MessageDigest messageDigest = MessageDigest.getInstance("SHA-1");

MD5与SHA-1的区别为:MD5是16位,SHA是20位(这是两种报文摘要的算法)

 

 

你可能感兴趣的:(加密,MD5,MessageDigest)