Java实现MD5加密解密类

MD5  加密解密类:

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



MD5 测试类:


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值