Md5Util加密工具類

 

/**
 * MD5加密工具類
 * @author john
 *
 */數據庫

public class Md5Util {
 private static final String HEX_NUMS_STR = "0123456789ABCDEF"; // 16進制字符串
 private static final Integer SALT_LENGTH = 12; // 鹽數據長度數組

/**
  * 將16進制字符串轉換成字節數組
  * @param hex
  * @return
  */app

public static byte[] hexStringToByte(String hex) {
  int len = (hex.length() / 2);
  byte[] result = new byte[len];
  // 將16進制數轉化爲字符數組
  char[] hexChars = hex.toCharArray();dom


  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++) {
   // 將Integer類型的參數轉換成16進制的字符串
   String hex = Integer.toHexString(b[i] & 0xFF);
   // 若是16進制字符串的長度爲1,在字符串前面添加一個0
   if (hex.length() == 1) {spa

            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);get

// 建立消息摘要對象
  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);

 }

}

相關文章
相關標籤/搜索