Java生成滿足正則表達式的隨機密碼

生成隨機密碼,密碼至少要包含 大寫字母,小寫字母,數字,特殊字符四者中的三種組合,並且要滿足線程安全。代碼如下:

public class PasswordGenerator {

  private static final String PASSWORD_REGEX = "((^(?=.*[a-z])(?=.*[A-Z])(?=.*\\W)[\\da-zA-Z\\W]{8,16}$)|(^(?=.*\\d)(?=.*[A-Z])(?=.*\\W)[\\da-zA-Z\\W]{8,16}$)|(^(?=.*\\d)(?=.*[a-z])(?=.*\\W)[\\da-zA-Z\\W]{8,16}$)|(^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])[\\da-zA-Z\\W]{8,16}$))";
  private static final Pattern PASSWORD_PATTERN = Pattern.compile(PASSWORD_REGEX);
  private static final char[] SEEDS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890~!@#$%^&*.?-+=_"
      .toCharArray();

  /**
   * 生成指定長度的隨機密碼
   *
   * @param length 密碼長度
   */
  public static String generatePassword(int length) {
    String result = getRandomPassword(length);
    Matcher m = PASSWORD_PATTERN.matcher(result);
    if (m.matches()) {
      return result;
    }
    return generatePassword(length);
  }

  private static String getRandomPassword(int length) {
    StringBuilder sb = new StringBuilder();
    ThreadLocalRandom r = ThreadLocalRandom.current();
    for (int x = 0; x < length; ++x) {
      sb.append(SEEDS[r.nextInt(SEEDS.length)]);
    }
    return sb.toString();
  }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章