密碼產生器完整指南:熵值、長度、字元集、2026 年最佳實踐

寫給:仍在用「Password123!」的所有用戶、想知道密碼到底要多長才安全的工程師、設計帳號系統卻不確定該強制哪些密碼規則的 PM。

「密碼超過 8 字、含大寫小寫數字符號」這個 1990 年代制定的規則,2026 年已被 NIST 800-63B 明確標為過時且有害。現代密碼安全的關鍵不是複雜度,而是熵值(entropy)+ 長度 + 不重複使用。本文 13 分鐘把密碼產生原理、熵值計算、passphrase 設計、Passkey 未來方向、SuperTools 線上工具實戰一次講透。

1. 密碼產生器是什麼

密碼產生器是用密碼學等級隨機數源(CSPRNG)+ 指定字元集 + 指定長度,產出無法被預測的字串。

範例:

12 字、含大小寫數字符號:  k7@xL2#pQ9!m
6 個英文單字 passphrase:  correct-horse-battery-staple-tomato-velvet

兩種風格各有優劣:

風格 範例 熵值 記憶難度 輸入難度
隨機字串 k7@xL2#pQ9!m 高(每字 6.5 bit) 困難 中
Passphrase correct-horse-battery-staple 高(每詞 13 bit) 容易 容易

兩種都「對的」,看用途選。

1.1 為什麼需要產生器

人腦無法隨機。研究顯示人類「自己想」的密碼有強烈 pattern:

  • 字典詞 + 數字(hello123)
  • 鍵盤序列(qwerty)
  • 個人資訊(生日 / 名字)
  • 重複使用一個密碼到處用

密碼產生器用 CSPRNG 真正隨機,破除所有 pattern。

2. 5 個核心觀念

2.1 熵值(Entropy)

熵值衡量密碼的「隨機性」,單位 bit。每多 1 bit,破解需嘗試次數翻倍。

公式:

entropy = log2(字元集大小 ^ 長度)
        = 長度 × log2(字元集大小)

範例:

密碼 字元集 長度 熵值
12345678 數字 10 8 26.6 bit
abcdefgh 小寫 26 8 37.6 bit
Abcd1234 大小寫+數字 62 8 47.6 bit
Ab1!Cd2# + 符號 ≈ 95 8 52.6 bit
Ab1!Cd2#Ef3% 同上 12 78.8 bit
correct horse battery staple 字典 7776 詞 × 4 4 詞 51.6 bit

實務目標:80 bit 以上為強密碼。

2.2 破解時間估算

GPU farm(2026 年 RTX 5090 集群):

演算法 每秒嘗試次數 80 bit 破解時間
MD5 / SHA-256(單 hash) 10^12 38 萬年
bcrypt cost=10 10^4 3.8 × 10^15 年
argon2id 標準 10^3 3.8 × 10^16 年

意義:

  • 用 SHA-256 hash 的系統,密碼至少 80 bit
  • 用 bcrypt/argon2 的系統,64 bit 就極安全(但建議仍 80 bit)

2.3 字元集選擇

字元集 大小 log2
純數字 0-9 10 3.32
純小寫 a-z 26 4.70
大小寫 52 5.70
大小寫 + 數字 62 5.95
+ 符號(常見 32 個) 94 6.55
Diceware 字典 7776 12.93

意義:每字符號可貢獻 6.55 bit;每字典詞可貢獻 12.93 bit。

12 字符號密碼 = 78.6 bit ≈ 6 詞 passphrase 77.6 bit。Passphrase 用 6 詞已勝過大多複雜密碼。

2.4 Passphrase(Diceware)

Diceware 1995 年由 Arnold Reinhold 提出:擲 5 顆骰子查表抽詞。

擲骰: 6-2-1-5-3
查 Diceware 表 → "rabbit"

EFF 改良版 7776 詞(去除生僻字、固定 4-6 字母長度):

# 從 EFF wordlist 抽 6 詞
shuf -n 6 eff_large_wordlist.txt | awk '{print $2}' | tr '\n' '-'
# resemble-mountain-photo-radio-tiger-bag

熵值:6 × 12.93 = 77.6 bit。

優點:

  • 記憶容易(人類擅長記詞)
  • 輸入容易(不需切換符號鍵盤)
  • 跨語言(中文可用四字成語版本)

2.5 NIST 800-63B 2026 規範

舊規範被淘汰的點:

舊規範 新規範
必須含大寫 / 數字 / 符號 不強制(鼓勵長密碼)
90 天定期換 取消定期換(除非疑似洩漏)
不可顯示密碼 可選 show password
禁止 paste 允許 paste(鼓勵用密碼管理器)
8 字以上 64 字以上允許(不限上限)

最重要的新規範:比對洩漏密碼黑名單(HIBP)。如果使用者輸入的密碼已在過去資料外洩名單中,必須拒絕。

3. 實戰範例

範例 1:Python 產隨機密碼

import secrets, string

def generate_password(length=16, use_symbols=True):
    chars = string.ascii_letters + string.digits
    if use_symbols:
        chars += "!@#$%^&*()_+-=[]{};:,.<>?"
    return "".join(secrets.choice(chars) for _ in range(length))

print(generate_password())
# k7@xL2#pQ9!mY3vR

重點:用 secrets 模組,不要用 random(不是密碼學等級隨機)。

範例 2:Python Passphrase

import secrets

# EFF wordlist 載入
with open("eff_large_wordlist.txt") as f:
    words = [line.split()[1] for line in f if line.strip()]

def passphrase(num_words=6, sep="-"):
    return sep.join(secrets.choice(words) for _ in range(num_words))

print(passphrase())
# salute-monsoon-marble-yacht-pebble-thirsty

範例 3:JavaScript(瀏覽器)

function generatePassword(length = 16, useSymbols = true) {
  let chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
  if (useSymbols) chars += "!@#$%^&*()_+-=[]{};:,.<>?";

  const arr = new Uint32Array(length);
  crypto.getRandomValues(arr);
  return Array.from(arr, n => chars[n % chars.length]).join("");
}

console.log(generatePassword());

重點:用 crypto.getRandomValues,不要用 Math.random。

範例 4:bash 一行產密碼

# 16 字含符號
openssl rand -base64 16 | tr -d "=+/" | cut -c1-16

# 32 字 hex
openssl rand -hex 16

# 從 /dev/urandom
LC_ALL=C tr -dc 'A-Za-z0-9!@#$%^&*' </dev/urandom | head -c 16
echo

# Passphrase
shuf -n 6 /usr/share/dict/words | tr '\n' '-' | sed 's/-$//'

範例 5:用 HIBP API 檢查密碼是否外洩

import hashlib, requests

def check_pwned(password):
    sha1 = hashlib.sha1(password.encode()).hexdigest().upper()
    prefix, suffix = sha1[:5], sha1[5:]

    # k-anonymity: 只送 SHA-1 前 5 碼
    resp = requests.get(f"https://api.pwnedpasswords.com/range/{prefix}")
    for line in resp.text.splitlines():
        hash_suffix, count = line.split(":")
        if hash_suffix == suffix:
            return int(count)
    return 0

count = check_pwned("password123")
print(f"洩漏次數: {count}")  # 數百萬次

只送前 5 個 hex 字元(k-anonymity)保護隱私,server 回傳所有以此前綴開頭的 hash,本地比對。

4. 進階技巧

4.1 強制不重複字元

import secrets, string

def unique_password(length=16):
    chars = string.ascii_letters + string.digits + "!@#$%^&*"
    if length > len(chars):
        raise ValueError("Length exceeds unique chars")
    return "".join(secrets.SystemRandom().sample(chars, length))

但這降低熵值(少了重複組合),實際無資安幫助,純粹避免人類覺得「怎麼重複了不夠隨機」。

4.2 易讀字元集(排除易混淆)

def readable_password(length=12):
    # 排除 0/O, 1/l/I 等
    chars = "ABCDEFGHJKLMNPQRSTUVWXYZ" + "abcdefghjkmnpqrstuvwxyz" + "23456789"
    return "".join(secrets.choice(chars) for _ in range(length))

適合:需要手動輸入到其他裝置(電視、IoT)的場景。

4.3 PIN(純數字)熵值補償

ATM PIN 4 位(13.3 bit)天生熵值低,靠嘗試次數限制補:

  • 3 次錯誤鎖卡 → 攻擊者最多猜 3 組
  • 13.3 bit 變相當於 60+ bit

設計帳號 PIN 時務必加 rate limit。

4.4 密碼管理器

人腦不該記 100 個密碼。用密碼管理器(Bitwarden、1Password、KeePass):

  • 每站獨立密碼
  • 自動填入
  • 跨裝置同步(端到端加密)
  • 主密碼是唯一要記的(請用 6 詞 passphrase)

2026 年沒用密碼管理器幾乎等於裸奔。

4.5 Passkey(密碼的未來)

Passkey(FIDO2 / WebAuthn)是 2024 年起取代密碼的方案:

  • 不需設定密碼
  • 用裝置生物辨識(Face ID / Touch ID)+ 私鑰簽章
  • 不可被釣魚(key 只能用在註冊的網域)
  • 可跨裝置同步(iCloud Keychain / Google Password Manager)

支援網站:Google、Apple、Microsoft、GitHub、Shopify、Best Buy 等。

2026 年新專案應同時支援 Passkey + 傳統密碼,提供 graceful transition。

5. 常見錯誤與解法

錯誤 1:用 Math.random() / random.randint

症狀:產出的密碼可預測。 根因:非密碼學等級 PRNG,種子可被推導。 解法:Python 用 secrets、JS 用 crypto.getRandomValues、bash 用 /dev/urandom。

錯誤 2:強制複雜度但允許短密碼

症狀:規定 8 字含符號,使用者寫 Pass123!。 根因:複雜度規則無法強制熵值。 解法:取消複雜度要求,改要求 12 字以上 + HIBP 黑名單比對。

錯誤 3:定期強制換密碼

症狀:每 90 天逼換 → 使用者改尾數(Pass123! → Pass124!)。 根因:違反人性 → 反而不安全。 解法:NIST 2026 規範取消定期換。只有疑似洩漏才換。

錯誤 4:密碼欄位禁止 paste

症狀:使用者無法用密碼管理器。 根因:以為禁 paste 較安全。 解法:允許 paste。鼓勵用密碼管理器。

錯誤 5:把密碼 hash 後就以為安全

症狀:用 SHA-256 hash 密碼,仍被 GPU 字典攻擊破。 根因:SHA 太快。 解法:用 argon2id / bcrypt(見 Hash 演算法完整比較)。

6. 用 SuperTools 線上版完成相同任務

需要快速產強密碼?打開 SuperTools 密碼產生器:

  • 隨機字串 + Passphrase 兩種模式
  • 長度 / 字元集自訂:8-64 字、勾選大寫 / 數字 / 符號
  • 熵值即時顯示:用顏色標弱(紅)/ 中(黃)/ 強(綠)
  • 易讀模式:排除 0/O 等易混淆字
  • HIBP 比對:自動 k-anonymity 查是否外洩
  • 批次模式:一次產 100 個(適合 seed 帳號)
  • 複製到剪貼簿:30 秒後自動清空

工具完全 client-side,密碼絕不上傳(除非主動點 HIBP 檢查,且只送 SHA-1 前 5 碼)。

實際使用流程:

  1. 開 supertools.tw/security/password
  2. 選「Passphrase 6 詞」
  3. 點「Generate」
  4. 看熵值 ≥ 80 bit 綠燈
  5. 一鍵複製貼入密碼管理器

立即使用 SuperTools 密碼產生器:https://supertools.tw/security/password

7. 其他語言實作

Python

import secrets, string
"".join(secrets.choice(string.ascii_letters + string.digits) for _ in range(16))

JavaScript

const arr = new Uint8Array(16);
crypto.getRandomValues(arr);
Array.from(arr, b => b.toString(16).padStart(2, "0")).join("");

Go

import "crypto/rand"
b := make([]byte, 16)
rand.Read(b)
fmt.Printf("%x", b)

Rust

use rand::Rng;
let s: String = rand::thread_rng()
    .sample_iter(&rand::distributions::Alphanumeric)
    .take(16)
    .map(char::from)
    .collect();

Bash

openssl rand -base64 16
LC_ALL=C tr -dc 'A-Za-z0-9' </dev/urandom | head -c 16

8. FAQ

Q1:12 字 vs 16 字 vs 20 字哪個對? 最低 12(72 bit)、推薦 16(96 bit)。Passphrase 6 詞起跳。

Q2:要不要分大寫數字符號? 不重要。長度與熵值才重要。

Q3:密碼可以放在 LastPass / 1Password 安全嗎? 2022 LastPass 事件後 1Password / Bitwarden 是較安全選擇。本機加密、零知識架構(雲端看不到內容)。

Q4:Passkey 已能完全取代密碼嗎? 2026 年「可選」,未強制。大部分網站仍 fallback 到密碼。

Q5:MFA / 2FA 比強密碼重要嗎? 都重要。即使密碼弱,TOTP / WebAuthn 二步驗證可大幅提升安全。

9. 實戰案例研究

案例 1:LastPass 2022 主密碼洩漏事件

2022 年 LastPass 雲端被入侵,加密 vault 全部外流。每個 user 的安全性取決於:

  1. 主密碼強度:弱密碼(< 10 字、字典詞)數小時內被破,所有存的密碼全失守
  2. PBKDF2 iterations:LastPass 預設 100,100 次,部分 user 仍是早期低設定(5,000 次),破解快 20 倍
  3. 是否啟用 MFA:開了 MFA 即使主密碼破也救得回

事後:

  • 大量 user 主密碼弱 → 被破 → crypto wallet 私鑰被偷 → 千萬美元被盜
  • 開 MFA 的人安全

教訓:主密碼必須 6 詞 passphrase 以上 + 開 MFA。

案例 2:90 天定期換密碼的反效果

某公司強制 90 天換密碼。研究發現 user 普遍用:

  • Password123! → Password124! → Password125!(尾數遞增)
  • 寫便利貼貼螢幕
  • 重複用其他公司密碼

結果安全反降。2017 NIST 報告明確記載這現象,建議取消定期換密碼。

修法(後續業界):

  • 只在「疑似洩漏」時強制換
  • 鼓勵 user 用密碼管理器
  • 加 MFA 而非加長密碼規則

教訓:複雜規則反人性 → 反不安全。

案例 3:Passkey 取代密碼的早期實踐

某新創 2024 年改用 Passkey-first(密碼為 fallback):

  • 註冊:FaceID/TouchID 一鍵綁定(無需 email 驗證)
  • 登入:FaceID 解鎖(無打字)
  • 跨裝置:iCloud Keychain / Google Password Manager 同步

成果:

  • 註冊轉換率 +35%(無 email 驗證流程)
  • 帳號被盜事件 0 起(vs 之前每月 5-10 起)
  • Support ticket 「忘記密碼」-95%

教訓:Passkey 不只是安全升級,是 UX 革命。

10. 結論 + 延伸閱讀

密碼安全的關鍵不是「複雜」而是「長且唯一」。掌握熵值計算、用 CSPRNG 產生器、搭配密碼管理器 + 二步驗證、未來逐步轉 Passkey,就是 2026 年的安全標配。下次設帳號時,先到 SuperTools 線上工具產一個 80 bit 熵值的密碼或 6 詞 passphrase,貼入密碼管理器,永遠不要再「自己想」密碼。三條黃金法則:用 passphrase 不用複雜符號、密碼管理器是必備、MFA / Passkey 是真正的護身符。

延伸閱讀: