MD5实现小应用

来源:互联网 发布:侠客风云传优化补丁 编辑:程序博客网 时间:2024/06/05 23:38

下面是实现MD5小技术的实例,给大家展示一下加密原理上篇文章。

首先创建一个类:MyMD5Util.java请看上边的详细注释。

[java] view plaincopy
  1. package com.zyg.security.md5;  
  2.   
  3.   
  4. import java.io.UnsupportedEncodingException;     
  5. import java.security.MessageDigest;     
  6. import java.security.NoSuchAlgorithmException;     
  7. import java.security.SecureRandom;     
  8. import java.util.Arrays;     
  9.   
  10. public class MyMD5Util {     
  11.          
  12.     private static final String HEX_NUMS_STR="0123456789ABCDEF";     
  13.     private static final Integer SALT_LENGTH = 12;   //控制生成密码的长度  
  14.          
  15.     /**    
  16.      * 将16进制字符串转换成字节数组    
  17.      * @param hex    
  18.      * @return    
  19.      */   
  20.     public static byte[] hexStringToByte(String hex) {     
  21.         int len = (hex.length() / 2);     
  22.         byte[] result = new byte[len];     
  23.         char[] hexChars = hex.toCharArray();     
  24.         for (int i = 0; i < len; i++) {     
  25.             int pos = i * 2;     
  26.             result[i] = (byte) (HEX_NUMS_STR.indexOf(hexChars[pos]) << 4      
  27.                             | HEX_NUMS_STR.indexOf(hexChars[pos + 1]));     
  28.         }     
  29.         return result;     
  30.     }     
  31.   
  32.          
  33.     /**  
  34.      * 将指定byte数组转换成16进制字符串  
  35.      * @param b  
  36.      * @return  
  37.      */   
  38.     public static String byteToHexString(byte[] b) {     
  39.         StringBuffer hexString = new StringBuffer();     
  40.         for (int i = 0; i < b.length; i++) {     
  41.             String hex = Integer.toHexString(b[i] & 0xFF);     
  42.             if (hex.length() == 1) {     
  43.                 hex = '0' + hex;     
  44.             }     
  45.             hexString.append(hex.toUpperCase());     
  46.         }     
  47.         return hexString.toString();     
  48.     }     
  49.          
  50.     /**  
  51.      * 验证口令是否合法  
  52.      * @param password  
  53.      * @param passwordInDb  
  54.      * @return  
  55.      * @throws NoSuchAlgorithmException  
  56.      * @throws UnsupportedEncodingException  
  57.      */   
  58.     public static boolean validPassword(String password, String passwordInDb)     
  59.             throws NoSuchAlgorithmException, UnsupportedEncodingException {     
  60.         //将16进制字符串格式口令转换成字节数组     
  61.         byte[] pwdInDb = hexStringToByte(passwordInDb);     
  62.         //声明盐变量     
  63.         byte[] salt = new byte[SALT_LENGTH];     
  64.         //将盐从数据库中保存的口令字节数组中提取出来     
  65.         System.arraycopy(pwdInDb, 0, salt, 0, SALT_LENGTH);     
  66.         //创建消息摘要对象     
  67.         MessageDigest md = MessageDigest.getInstance("MD5");     
  68.         //将盐数据传入消息摘要对象     
  69.         md.update(salt);     
  70.         //将口令的数据传给消息摘要对象     
  71.         md.update(password.getBytes("UTF-8"));     
  72.         //生成输入口令的消息摘要     
  73.         byte[] digest = md.digest();     
  74.         //声明一个保存数据库中口令消息摘要的变量     
  75.         byte[] digestInDb = new byte[pwdInDb.length - SALT_LENGTH];     
  76.         //取得数据库中口令的消息摘要     
  77.         System.arraycopy(pwdInDb, SALT_LENGTH, digestInDb, 0, digestInDb.length);     
  78.         //比较根据输入口令生成的消息摘要和数据库中消息摘要是否相同     
  79.         if (Arrays.equals(digest, digestInDb)) {     
  80.             //口令正确返回口令匹配消息     
  81.             return true;     
  82.         } else {     
  83.             //口令不正确返回口令不匹配消息     
  84.             return false;     
  85.         }     
  86.     }     
  87.   
  88.   
  89.     /**  
  90.      * 获得加密后的16进制形式口令  
  91.      * @param password  
  92.      * @return  
  93.      * @throws NoSuchAlgorithmException  
  94.      * @throws UnsupportedEncodingException  
  95.      */   
  96.     public static String getEncryptedPwd(String password)     
  97.             throws NoSuchAlgorithmException, UnsupportedEncodingException {     
  98.         //声明加密后的口令数组变量     
  99.         byte[] pwd = null;     
  100.         //随机数生成器     
  101.         SecureRandom random = new SecureRandom();     
  102.         //声明盐数组变量     
  103.         byte[] salt = new byte[SALT_LENGTH];     
  104.         //将随机数放入盐变量中     
  105.         random.nextBytes(salt);     
  106.   
  107.         //声明消息摘要对象     
  108.         MessageDigest md = null;     
  109.         //创建消息摘要     
  110.         md = MessageDigest.getInstance("MD5");     
  111.         //将盐数据传入消息摘要对象     
  112.         md.update(salt);     
  113.         //将口令的数据传给消息摘要对象     
  114.         md.update(password.getBytes("UTF-8"));     
  115.         //获得消息摘要的字节数组     
  116.         byte[] digest = md.digest();     
  117.   
  118.         //因为要在口令的字节数组中存放盐,所以加上盐的字节长度     
  119.         pwd = new byte[digest.length + SALT_LENGTH];     
  120.         //将盐的字节拷贝到生成的加密口令字节数组的前12个字节,以便在验证口令时取出盐     
  121.         System.arraycopy(salt, 0, pwd, 0, SALT_LENGTH);     
  122.         //将消息摘要拷贝到加密口令字节数组从第13个字节开始的字节     
  123.         System.arraycopy(digest, 0, pwd, SALT_LENGTH, digest.length);     
  124.         //将字节数组格式加密后的口令转化为16进制字符串格式的口令     
  125.         return byteToHexString(pwd);     
  126.     }     
  127. }  

创建一个测试类:Client.java,这样MD5就可以测试我们写的实例了。


[java] view plaincopy
  1. <pre name="code" class="java">package com.zyg.security.md5;  
  2. import java.io.UnsupportedEncodingException;     
  3. import java.security.NoSuchAlgorithmException;     
  4. import java.util.HashMap;     
  5. import java.util.Map;     
  6.   
  7. public class Client {     
  8.     private static Map users = new HashMap();     
  9.          
  10.     public static void main(String[] args){     
  11.         String userName = "zyg";     
  12.         String password = "123";     
  13.         registerUser(userName,password);     
  14.         
  15.         String loginUserId = "zyg";     
  16.         String pwd = "123";     
  17.         try {     
  18.             if(loginValid(loginUserId,pwd)){     
  19.                 System.out.println("欢迎登陆!!!");     
  20.             }else{     
  21.                 System.out.println("口令错误,请重新输入!!!");     
  22.             }     
  23.         } catch (NoSuchAlgorithmException e) {     
  24.             // TODO Auto-generated catch block     
  25.             e.printStackTrace();     
  26.         } catch (UnsupportedEncodingException e) {     
  27.             // TODO Auto-generated catch block     
  28.             e.printStackTrace();     
  29.         }      
  30.     }     
  31.          
  32.     /**  
  33.      * 注册用户  
  34.      *    
  35.      * @param userName  
  36.      * @param password  
  37.      */   
  38.     public static void registerUser(String userName,String password){     
  39.         String encryptedPwd = null;     
  40.         try {     
  41.             encryptedPwd = MyMD5Util.getEncryptedPwd(password);     
  42.                  
  43.             users.put(userName, encryptedPwd);     
  44.                  
  45.         } catch (NoSuchAlgorithmException e) {     
  46.             // TODO Auto-generated catch block     
  47.             e.printStackTrace();     
  48.         } catch (UnsupportedEncodingException e) {     
  49.             // TODO Auto-generated catch block     
  50.             e.printStackTrace();     
  51.         }     
  52.     }     
  53.          
  54.     /**  
  55.      * 验证登陆  
  56.      *    
  57.      * @param userName  
  58.      * @param password  
  59.      * @return  
  60.      * @throws UnsupportedEncodingException    
  61.      * @throws NoSuchAlgorithmException    
  62.      */   
  63.     public static boolean loginValid(String userName,String password)      
  64.                 throws NoSuchAlgorithmException, UnsupportedEncodingException{     
  65.         String pwdInDb = (String)users.get(userName);     
  66.         if(null!=pwdInDb){ // 该用户存在     
  67.                 return MyMD5Util.validPassword(password, pwdInDb);     
  68.         }else{     
  69.             System.out.println("不存在该用户!!!");     
  70.             return false;     
  71.         }     
  72.     }     
  73. }  
0 0
原创粉丝点击