KeyGenerator.io

API 金鑰產生器

字元對網址與 shell 都安全的隨機 API 金鑰,在你的瀏覽器裡產生。不連網,不記錄,不上傳。

0 位元熵

金鑰長度
編碼

空白鍵 換一個,C 複製。金鑰由本機的 crypto.getRandomValues 產生,頁面不載入任何外部資源。

這把金鑰是怎麼產生的

API 金鑰並不是本站其他產生器所產生的那種密碼學金鑰 —— 沒有東西用它簽章或解密。它只是一串你的伺服器認得的長隨機字串,因此唯一重要的性質是:沒有人猜得到它,也造不出另一把你的伺服器會接受的。128 位元的隨機性就已經在可及範圍之外,而大多數服務最後選的是 256。

這些位元組取自 crypto.getRandomValues,也就是瀏覽器的密碼學安全亂數產生器,再以 Base64URL 或十六進位寫出。這兩種字母表穿過網址、HTTP 標頭、環境變數和 shell 指令時都不需要跳脫 —— 這也正是這裡不提供普通 Base64 的原因,它含有 +、/ 和 =。整條路徑上沒有時間戳、沒有計數器,也沒有 Math.random。

全部在你自己的裝置上完成。頁面載入後不發出任何網路請求,所以這把金鑰從未在別處存在過,也不會傳到任何地方。重新整理就消失 —— 這也意味著關掉分頁之前,記得先把它貼進你的金鑰儲存區。

常見問題

API 金鑰該多長?

128 位元的隨機性 —— 也就是 22 個 Base64URL 字元 —— 就已經超出暴力破解的範圍,沒有人能穿過你的速率限制把這樣一把金鑰猜出來。256 位元是常見的預設值,主要是因為它幾乎不增加成本,還能讓這個問題在程式碼審查時不必再提。再長完全不會更安全,只會讓金鑰更難貼、也更容易在路上被某行日誌或某個資料庫欄位截斷。

可以拿 UUID 當 API 金鑰嗎?

可以,但它沒有看起來那麼可靠。隨機的 UUIDv4 帶的是 122 位元而不是 128,因為其中有六個位元是固定的版本與變體標記 —— 這仍然夠用,但前提是背後接的是密碼學安全亂數產生器,而不少實作其實悄悄用了普通的亂數。UUIDv1 和 v7 內嵌時間戳,設計上就有一部分可預測。而且 UUID 一眼就被認出是識別碼,這會誘使下游的每一個環節把它當識別碼看待並寫進日誌。

金鑰要不要加前綴?

如果你是發放金鑰的一方,要。像 sk_live_ 或 myapp_ 這樣的前綴能讓外洩的金鑰一眼可辨,更實際的好處是給了 GitHub 和 GitLab 的機密掃描一個可比對的模式,於是誤提交的金鑰會被通報,而不是靜靜躺在那裡。它也讓你能在碰資料庫之前就依前綴分流或直接拒絕。把它加在本頁產生的值前面即可:前綴不是機密,也不提供任何熵,所以它不取代隨機部分的任何一個字元。

伺服器端該怎麼保存 API 金鑰?

像存密碼那樣存雜湊 —— 一把能從你的資料庫裡讀出來的金鑰,等於一次隨時可以被匯出的外洩。但和密碼不同的是,這裡用普通的 SHA-256 就夠,不需要 bcrypt 這類慢雜湊:金鑰本身已經是 128 位元的均勻隨機,沒有字典可以拿來跑,也沒有理由在每一個請求上付那份成本。另外把前綴或末四碼明文留著,讓金鑰能在列表裡被認出來,而完整的值只在建立當下顯示一次。

API 金鑰、token 和 JWT 有什麼差別?

API 金鑰是不透明的:除了發出它的系統之外它不代表任何意義,而那個系統必須查一次才能驗證。JWT 正好相反 —— 它把宣告和到期時間帶在自己身上並附有簽章,所以服務不必查詢就能驗證。OAuth 意義下的 token 比較靠近 JWT 那一端:生命週期短、有範圍限制,而且是在另一次認證之後才發出的。機器需要能寫進設定檔的長期存取時用金鑰;存取本身就該自動到期時用 token。

該選 Base64URL 還是十六進位?

兩者是同一串位元組,差別在長度,以及這串字元能在哪些地方不經跳脫地存活。Base64URL 比較短 —— 256 位元是 43 個字元,十六進位則要 64 個 —— 而且它的字母表是 A-Z、a-z、0-9、連字號和底線,全都能原封不動地穿過網址、標頭和 shell。十六進位比較長,但更容易念出來、口述和用眼睛比對,也不會在任何大小寫處理不當的地方出事。真正該避開的是普通 Base64:+ 和 / 在網址裡要跳脫,而 = 這個補位字元在傳輸途中經常被剝掉。

可以把 API 金鑰放進網址嗎?

盡量別。查詢字串會被寫進伺服器存取日誌、代理日誌和瀏覽器歷史紀錄,還會透過 Referer 標頭洩漏給頁面接下來連往的任何地方 —— 請求一旦送出,這些都不在你的控制範圍內。改用 Authorization 標頭傳送,也就是 Authorization: Bearer 後面接金鑰,一般的日誌預設不會記錄它。這裡採用網址安全字母表,是為了偶爾出現的路徑片段或 webhook 回呼,而不是為了讓查詢字串變成一個放機密的好地方。

金鑰該多久輪替一次?

比密碼學金鑰輕鬆得多:輪替 API 金鑰不需要重新加密任何東西,成本全部在協調用戶端這一件事上。讓每個帳號能同時持有兩把有效金鑰,輪替就變成建立、部署、撤銷三步,中間沒有任何服務中斷的空窗。按時程走的話,多數系統一年一到兩次就綽綽有餘。更重要的是撤銷必須是即時而且能自助完成的,因為真正要緊的那次輪替永遠是計畫外的那次。

在瀏覽器裡產生 API 金鑰安全嗎?

只有在這個頁面無法把它送出去的前提下才安全,而這件事你可以查證,不必只是相信。打開開發者工具停在「網路」分頁,然後隨便產生幾次:頁面載入之後不發出任何請求。它背後沒有伺服器可以接收任何東西,也沒有分析工具或第三方腳本可以外洩。在你把它貼到別處之前,這把金鑰只存在於這一個分頁的記憶體裡,重新整理就沒了。