產生隨機字串是常見需求:驗證碼、臨時密碼、唯一代碼、測試資料等。本文提供一個功能完整、易於擴充的 PassWord 工具類,支援 8 種字元組合模式,長度可自訂,採用 SecureRandom 強化安全性。
package com.example.util;
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class PassWord {
/** 字元類型枚舉 */
public enum Type {
LETTER, // 小寫字母
CAPITAL, // 大寫字母
NUMBER, // 數字
SIGN, // 符號
LETTER_CAPITAL, // 大小寫字母
LETTER_NUMBER, // 小寫字母+數字
LETTER_CAPITAL_NUMBER, // 大小寫字母+數字
LETTER_CAPITAL_NUMBER_SIGN // 全組合
}
private static final String[] LOWER = {
"a","b","c","d","e","f","g","h","i","j","k","l","m",
"n","o","p","q","r","s","t","u","v","w","x","y","z"
};
private static final String[] UPPER = {
"A","B","C","D","E","F","G","H","I","J","K","L","M",
"N","O","P","Q","R","S","T","U","V","W","X","Y","Z"
};
private static final String[] DIGITS = {"0","1","2","3","4","5","6","7","8","9"};
private static final String[] SIGNS = {
"~","!","@","#","$","%","^","&","*","(",")","_","+","`","-","=",
"{","}","|",":","\"","<",">","?","[","]","\\",";","'",",",".","/"
};
private static final SecureRandom RANDOM = new SecureRandom();
/**
* 產生隨機字串
* @param length 字串長度
* @param type 字元類型
* @return 隨機字串
*/
public static String generate(int length, Type type) {
if (length <= 0) throw new IllegalArgumentException("長度必須大於 0");
List<String> pool = new ArrayList<>();
switch (type) {
case LETTER: pool.addAll(Arrays.asList(LOWER)); break;
case CAPITAL: pool.addAll(Arrays.asList(UPPER)); break;
case NUMBER: pool.addAll(Arrays.asList(DIGITS)); break;
case SIGN: pool.addAll(Arrays.asList(SIGNS)); break;
case LETTER_CAPITAL:
pool.addAll(Arrays.asList(LOWER));
pool.addAll(Arrays.asList(UPPER));
break;
case LETTER_NUMBER:
pool.addAll(Arrays.asList(LOWER));
pool.addAll(Arrays.asList(DIGITS));
break;
case LETTER_CAPITAL_NUMBER:
pool.addAll(Arrays.asList(LOWER));
pool.addAll(Arrays.asList(UPPER));
pool.addAll(Arrays.asList(DIGITS));
break;
case LETTER_CAPITAL_NUMBER_SIGN:
pool.addAll(Arrays.asList(LOWER));
pool.addAll(Arrays.asList(UPPER));
pool.addAll(Arrays.asList(DIGITS));
pool.addAll(Arrays.asList(SIGNS));
break;
default: throw new IllegalArgumentException("不支援的類型: " + type);
}
StringBuilder sb = new StringBuilder(length);
for (int i = 0; i < length; i++) {
sb.append(pool.get(RANDOM.nextInt(pool.size())));
}
return sb.toString();
}
// 測試主程式
public static void main(String[] args) {
System.out.println("純大寫 10 碼: " + generate(10, Type.CAPITAL));
System.out.println("大小寫+數字 16 碼: " + generate(16, Type.LETTER_CAPITAL_NUMBER));
System.out.println("全組合 24 碼: " + generate(24, Type.LETTER_CAPITAL_NUMBER_SIGN));
}
}
| 需求 | 呼叫方式 | 輸出範例 |
|---|---|---|
| 6 位數字驗證碼 | generate(6, Type.NUMBER) | 839201 |
| 8 碼大小寫混合密碼 | generate(8, Type.LETTER_CAPITAL) | aBcDeFgH |
| 12 碼強密碼(含符號) | generate(12, Type.LETTER_CAPITAL_NUMBER_SIGN) | P@ssw0rd!23# |
| 32 碼 API Token | generate(32, Type.LETTER_CAPITAL_NUMBER) | a1B2c3D4e5F6g7H8... |
Random 更適合安全性敏感場景(密碼、Token),預設使用系統熵源。List<String> 彈性組裝所需字元集,避免大量 if-else 重複程式碼。length 減少擴容開銷。0/O、1/l/I、2/Z 等,提升人工辨識度。generate(int length, String customCharset) 多載方法。Set<String> 去重,適用於優惠券、序號生成。char[] 陣列,直接索引取字元,減少物件建立。Math.random()?Math.random() 內部使用共享 Random 實例,多執行緒下有競爭問題,且非加密安全。Type.LETTER_CAPITAL_NUMBER_SIGN,並搭配 HTTPS、HttpOnly、SameSite 屬性。此工具類結構清晰、擴充性佳,可直接整合至專案中滿足各類隨機字串需求。