Java实现MD5加密解密类

发布时间:2019-11-19 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了Java实现MD5加密解密类脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

Java实现MD5加密以及解密类,附带测试类,具体见代码。

MD5加密解密类——MyMD5Util,代码如下

package com.zyg.security.md5;  import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.util.Arrays;  public class MyMD5Util {    private static final String HEX_NUMS_STR="0123456789ABCDEF";  private static final Integer SALT_LENGTH = 12;    /**    * 将16进制字符串转换成字节数组    * @param hex    * @return    */  public static byte[] hexStringToByte(String hex) {   int len = (hex.length() / 2);   byte[] result = new byte[len];   char[] hexChars = hex.toCharArray();   for (int i = 0; i < len; i++) {    int pos = i * 2;    result[i] = (byte) (HEX_NUMS_STR.indexOf(hexChars[pos]) << 4         | HEX_NUMS_STR.indexOf(hexChars[pos + 1]));   }   return result;  }     /**   * 将指定byte数组转换成16进制字符串   * @param b   * @return   */  public static String byteToHexString(byte[] b) {   StringBuffer hexString = new StringBuffer();   for (int i = 0; i < b.length; i++) {    String hex = Integer.toHexString(b[i] &amp; 0xFF);    if (hex.length() == 1) {     hex = '0' + hex;    }    hexString.append(hex.toUpperCase());   }   return hexString.toString();  }    /**   * 验证口令是否合法   * @param password   * @param passwordInDb   * @return   * @throws NoSuchAlgorithmException   * @throws UnsupportedEncodingException   */  public static boolean validPassword(String password, String passwordInDb)    throws NoSuchAlgorithmException, UnsupportedEncodingException {   //将16进制字符串格式口令转换成字节数组   byte[] pwdInDb = hexStringToByte(passwordInDb);   //声明盐变量   byte[] salt = new byte[SALT_LENGTH];   //将盐从数据库中保存的口令字节数组中提取出来   System.arraycopy(pwdInDb, 0, salt, 0, SALT_LENGTH);   //创建消息摘要对象   MessageDigest md = MessageDigest.getInstance("MD5");   //将盐数据传入消息摘要对象   md.update(salt);   //将口令的数据传给消息摘要对象   md.update(password.getBytes("UTF-8"));   //生成输入口令的消息摘要   byte[] digest = md.digest();   //声明一个保存数据库中口令消息摘要的变量   byte[] digestInDb = new byte[pwdInDb.length - SALT_LENGTH];   //取得数据库中口令的消息摘要   System.arraycopy(pwdInDb, SALT_LENGTH, digestInDb, 0, digestInDb.length);   //比较根据输入口令生成的消息摘要和数据库中消息摘要是否相同   if (Arrays.equals(digest, digestInDb)) {    //口令正确返回口令匹配消息    return true;   } else {    //口令不正确返回口令不匹配消息    return false;   }  }    /**   * 获得加密后的16进制形式口令   * @param password   * @return   * @throws NoSuchAlgorithmException   * @throws UnsupportedEncodingException   */  public static String getEncryptedPwd(String password)    throws NoSuchAlgorithmException, UnsupportedEncodingException {   //声明加密后的口令数组变量   byte[] pwd = null;   //随机数生成器   SecureRandom random = new SecureRandom();   //声明盐数组变量   byte[] salt = new byte[SALT_LENGTH];   //将随机数放入盐变量中   random.nextBytes(salt);    //声明消息摘要对象   MessageDigest md = null;   //创建消息摘要   md = MessageDigest.getInstance("MD5");   //将盐数据传入消息摘要对象   md.update(salt);   //将口令的数据传给消息摘要对象   md.update(password.getBytes("UTF-8"));   //获得消息摘要的字节数组   byte[] digest = md.digest();    //因为要在口令的字节数组中存放盐,所以加上盐的字节长度   pwd = new byte[digest.length + SALT_LENGTH];   //将盐的字节拷贝到生成的加密口令字节数组的前12个字节,以便在验证口令时取出盐   System.arraycopy(salt, 0, pwd, 0, SALT_LENGTH);   //将消息摘要拷贝到加密口令字节数组从第13个字节开始的字节   System.arraycopy(digest, 0, pwd, SALT_LENGTH, digest.length);   //将字节数组格式加密后的口令转化为16进制字符串格式的口令   return byteToHexString(pwd);  } }  测试类——Client,代码如下:  package com.zyg.security.md5;  import java.io.UnsupportedEncodingException; import java.security.NoSuchAlgorithmException; import java.util.HashMap; import java.util.Map;  public class Client {  private static Map users = new HashMap();    public static void main(String[] args){   String userName = "zyg";   String password = "123";   registerUser(userName,password);      userName = "changong";   password = "456";   registerUser(userName,password);      String loginUserId = "zyg";   String pwd = "1232";   try {    if(LOGinValid(loginUserId,pwd)){     System.out.println("欢迎登陆!!!");    }else{     System.out.println("口令错误,请重新输入!!!");    }   } catch (NoSuchAlgorithmException e) {    // TODO Auto-generated catch block    e.printStackTrace();   } catch (UnsupportedEncodingException e) {    // TODO Auto-generated catch block    e.printStackTrace();   }   }    /**   * 注册用户   *    * @param userName   * @param password   */  public static void registerUser(String userName,String password){   String encryptedPwd = null;   try {    encryptedPwd = MyMD5Util.getEncryptedPwd(password);        users.put(userName, encryptedPwd);       } catch (NoSuchAlgorithmException e) {    // TODO Auto-generated catch block    e.printStackTrace();   } catch (UnsupportedEncodingException e) {    // TODO Auto-generated catch block    e.printStackTrace();   }  }    /**   * 验证登陆   *    * @param userName   * @param password   * @return   * @throws UnsupportedEncodingException    * @throws NoSuchAlgorithmException    */  public static boolean loginValid(String userName,String password)      throws NoSuchAlgorithmException, UnsupportedEncodingException{   String pwdInDb = (String)users.get(userName);   if(null!=pwdInDb){ // 该用户存在     return MyMD5Util.validPassword(password, pwdInDb);   }else{    System.out.println("不存在该用户!!!");    return false;   }  } }

脚本宝典总结

以上是脚本宝典为你收集整理的Java实现MD5加密解密类全部内容,希望文章能够帮你解决Java实现MD5加密解密类所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。