使用方法
- 設定長度,並選擇按隨機資料的位元組數還是按 Base64 字元數計算。生成金鑰時建議按位元組,32 位元組即 256 位金鑰。
- 設定需要生成的數量,以及各結果之間的分隔符:換行、逗號或空格。
- 選擇標準或 URL 安全變體。按位元組生成時,如果目標系統不需要末尾的等號,還可以關閉填充。
- 點選「生成」獲取新的隨機值,然後點選「全部複製」或「下載」。
位元組、字元與熵
隨機字串的強度用熵(以位為單位)來衡量。每個隨機位元組提供 8 位熵,因此 16 位元組是 128 位,32 位元組是 256 位。Base64 只是改變了這些位元組的書寫方式:每個字元承載 6 位,每 3 個位元組變成 4 個字元。工具會顯示每個字串的熵,方便你隨時核對。
選擇位元組單位時,輸出解碼後正好是指定數量的隨機位元組,這正是金鑰和機密所需要的。選擇字元單位時,會得到精確數量的字元,每個字元都從 64 個字元的字母表中均勻選取,適合系統要求固定長度、並按文字儲存的權杖。
| 位元組數 | Base64 字元數 | 熵 | 典型用途 |
|---|---|---|---|
| 12 | 16 | 96 位 | AES-GCM 的 nonce(IV) |
| 16 | 24(不填充時 22) | 128 位 | 鹽值、會話權杖、CSRF 權杖、AES-128 金鑰 |
| 32 | 44(不填充時 43) | 256 位 | AES-256 和 HMAC-SHA256 金鑰、HS256 金鑰、API 金鑰 |
| 64 | 88(不填充時 86) | 512 位 | HMAC-SHA512 金鑰、HS512 金鑰 |
隨機 Base64 的常見用途
- JWT 金鑰。RFC 7518 要求 HMAC 金鑰長度不小於雜湊輸出長度:HS256 至少 32 位元組,HS384 至少 48 位元組,HS512 至少 64 位元組。有的程式庫直接把金鑰字串當作金鑰,有的會先做 Base64 解碼,請確認你所用的庫屬於哪一種。JWT 解碼工具可以用這兩種形式的金鑰驗證 HS256 到 HS512 簽名,HMAC 生成器也支援以文字、十六進位或 Base64 形式輸入金鑰。
- 應用金鑰。例如 Laravel 會把 32 位元組的加密金鑰以
APP_KEY=base64:...的形式寫在.env檔案中,與本工具按 32 位元組生成的字串格式相同。 - Kubernetes Secret。
data下的值必須是帶填充的標準 Base64。按位元組、標準變體並開啟填充生成的字串可以直接填入,Pod 拿到的是原始隨機位元組。如果應用需要的是 Base64 文字本身,請改用stringData。 - URL 中的權杖。重置密碼連結、邀請碼等需要放進 URL 的權杖應使用 URL 安全變體,它用
-和_代替+和/,詳見 Base64URL。
為什麼用 crypto.getRandomValues 而不是 Math.random
Math.random() 是快速的通用隨機數生成器,其輸出並不保證不可預測,在某些 JavaScript 引擎中,只需少量輸出就能推算出內部狀態。本工具使用 crypto.getRandomValues(),這是由作業系統提供種子的加密安全隨機數生成器,與 openssl rand 和 Python 的 secrets 模組屬於同一類隨機源。所有值都在你的裝置上生成,不會被髮送或儲存。
在程式碼中生成隨機 Base64
# Shell:32 個隨機位元組的 Base64(44 個字元)
openssl rand -base64 32
head -c 32 /dev/urandom | base64
# Python
import base64, secrets
base64.b64encode(secrets.token_bytes(32)).decode()
secrets.token_urlsafe(32) # URL 安全,無填充,43 個字元
// Node.js
const crypto = require('crypto');
crypto.randomBytes(32).toString('base64');
crypto.randomBytes(32).toString('base64url'); // URL 安全,無填充
// 瀏覽器
const bytes = crypto.getRandomValues(new Uint8Array(32));
btoa(String.fromCharCode(...bytes));
常見問題
隨機金鑰應該多長?
如果只要求值唯一且無法被猜到,例如會話 ID、CSRF 權杖和鹽值,16 位元組(128 位)就足夠了。AES-256 金鑰、HMAC-SHA256 金鑰和 HS256 金鑰建議使用 32 位元組(256 位),HMAC-SHA512 和 HS512 則使用 64 位元組。
和 openssl rand -base64 32 的結果一樣嗎?
=,解碼後是 32 個隨機位元組。當然,每次生成的具體值都不一樣。應該按位元組還是按字元設定長度?
如果字串之後要被解碼,例如加密金鑰和 Kubernetes Secret,請按位元組。如果系統需要固定長度、直接按文字使用的權杖,請按字元。按字元生成的字串,只有長度是 4 的倍數時才能保證正常解碼。
什麼時候需要 URL 安全變體?
/ 會分隔 URL 路徑,+ 在表單編碼的查詢字串裡會變成空格。URL 安全的 Base64 改用 - 和 _,通常也不帶填充。生成的值會被儲存或上傳嗎?
不會。所有值都由瀏覽器中的 JavaScript 生成,不會傳輸到任何地方,離開頁面後即消失。一旦把某個值用作真正的機密,請把它儲存在密碼管理器或金鑰管理服務中,不要放在聊天記錄或工單裡。