MD5Util 加密工具 生成带盐秘钥

MD5Util 加密工具 生成带盐秘钥

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Arrays;

/**

  • MD5Util 加密工具

  • 用于将字段信息转成MD5
    */
    public class MD5Util {

    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[] hexChar = hex.toCharArray();
      for(int i = 0; i<len; i++){
      int pos = i*2;
      result[i] = (byte)(HEX_NUMS_STR.indexOf(hexChar[pos])<<4 | HEX_NUMS_STR.indexOf(hexChar[pos+1]));
      }
      return result;
      }
      /**

    • 将字节数组转换为16进制字符串

    • @param b

    • @return
      /
      public static String byteToString(byte[] b){
      StringBuffer hexString = new StringBuffer();
      for(int j = 0; j<b.length; j++){
      String hex = Integer.toHexString(b[j] & 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 byteToString(pwd);
      }
      }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值