首頁 / 從這裡開始

API Key 是什麼?用途、外洩風險與安全保管方法

作者 JC · 更新於 · 最後查證

重點速覽

API Key(API 金鑰)是一串讓服務辨認「這個請求是哪個帳號送出的」的字串,程式把它附在每次請求裡,服務就依此授權與計費。它像信用卡號:任何人拿到都能用你的額度,費用算在你頭上。保管的重點是不讓它出現在程式碼、Git 紀錄、截圖與對話裡,改用環境變數存放,並分開用途、設定用量上限;一旦外洩,第一步永遠是立刻撤銷。

API Key 是什麼?簡單說,它是一串讓服務辨認「這個請求是哪個帳號送出的」的字串。你寫的程式、用的 AI 工具要呼叫 OpenAI、Anthropic、Google 這類服務時,都會把它附在請求裡,服務就依此決定要不要處理、以及要把費用算給誰。這篇不綁定特定服務商,講的是每一家都通用的觀念:API Key 的用途、為什麼外洩等於讓別人花你的錢、最常外洩的地方,以及保管與出事時的處理方法。

API Key 是什麼?

先定義兩個名詞。API(應用程式介面)是讓程式之間互相溝通的約定;API Key(API 金鑰)則是這個溝通過程中,用來證明身分的那串字。

它和你平常登入用的密碼不太一樣:

密碼API Key
誰在用你自己,登入時輸入程式,每次請求都附上
用來做什麼進入你的帳號讓程式以你的帳號呼叫服務
可以有幾個通常一個帳號一組可以替不同用途各建一把
出事時改密碼停用那一把,再建新的

Anthropic 的官方說明用了一個很好懂的比喻:API Key 就像信用卡號,任何人拿到並使用,產生的費用都算在你頭上。所以問題不在於「別人會不會猜到」,而在於「它會不會被你自己不小心放到別人看得到的地方」。

如果你還沒實際呼叫過 API,可以先看 第一次呼叫 LLM API,那篇示範了金鑰放在請求的哪裡;這篇專講怎麼保管。

為什麼外洩這麼嚴重?

GitHub 的文件把外洩的後果分成幾類,對個人使用者最直接的是兩種:

  • 帳單:別人用你的金鑰呼叫服務,費用由你支付。如果你沒有設定用量上限,損失可能遠超出你的預期。
  • 資料:依那把金鑰的權限,對方可能讀到或改動你放在該服務裡的資料。

還有一個容易被忽略的特性:外洩之後,你很難確定它「到底傳到了哪裡」。GitHub 指出,公開儲存庫裡的祕密會被搜尋引擎和專門的掃描服務索引。所以處理外洩的思路,不是「把它藏回去」,而是「讓它失效」。

API Key 最常外洩的 8 個地方

下面這張表是本站整理的常見情況,不是官方標準;每一列的依據都附在文末的連結裡。

外洩的地方怎麼發生的怎麼預防
程式碼裡測試時把金鑰直接寫在程式裡,後來一起提交程式只讀環境變數,程式碼裡永遠不出現金鑰
.env 檔被提交忘了把 .env 加進 .gitignore第一次提交前就設好 .gitignore,並用指令確認
README、文件、範例範例設定裡放了真的金鑰範例只用明顯的假值
GitHub 的 Issue 與 PR 留言、論壇、Email、客服工單求救時把錯誤訊息連同金鑰一起貼上貼之前先把金鑰刪掉;Anthropic 提醒連對它的客服都不要給
截圖、錄影、直播畫面上剛好開著含金鑰的檔案或終端機錄製前關掉這些視窗,發布前再檢查一次畫面
貼進 AI 對話,或讓 AI 代理讀到請 AI 除錯時整段設定貼上;代理讀了專案裡的 .env不貼金鑰本身;限制代理讀取機密檔案
前端(瀏覽器)程式碼金鑰寫在網頁的 JavaScript 裡金鑰只放在伺服器端,由伺服器代為呼叫
自動化流程的紀錄自動化流程或腳本把金鑰印進紀錄(log)不印出金鑰;用平台提供的祕密儲存功能

幾個需要多說明的地方:

前端程式碼:網頁上的 JavaScript 會下載到每個訪客的瀏覽器裡執行,所以寫在裡面的金鑰,等於公開給所有訪客。Anthropic 的 TypeScript SDK(官方提供給 TypeScript 程式使用的套件)就因此預設停用在瀏覽器裡執行,理由正是避免暴露金鑰。

AI 代理:AI 代理會讀你的檔案、執行指令。如果金鑰放在它的工作資料夾裡,它就可能讀到,並把內容放進對話裡。Claude Code 的文件提供了用拒絕規則禁止讀取 .env 的做法;更完整的原則請看 讓 AI 代理安全操作電腦。

共用一把金鑰:Anthropic 的建議是,每個需要使用 API 的人都應該有自己的金鑰。共用的金鑰一旦外洩,你無法知道是誰那裡出的問題,也無法只停用其中一人。

保管的基本功:環境變數與 .env

環境變數(Environment variable)是作業系統提供給程式讀取的「名稱=值」設定。把金鑰放在環境變數裡,程式碼裡只寫「去讀某某變數」,金鑰本身就不會出現在程式碼中。

這個做法來自一份廣為引用的軟體開發方法論〈The Twelve-Factor App〉:設定(包括外部服務的憑證)要和程式碼嚴格分開,存在環境變數裡。它提供了一個好用的自我檢查:如果你的程式碼現在立刻公開,會不會洩漏任何憑證? 會的話,就表示金鑰還放錯地方。

環境變數怎麼設定、Windows 和 Mac 有什麼不同,請看 終端機基礎。

.env 檔

每次都手動設定環境變數很麻煩,所以很多專案會用 .env 檔:一個把環境變數以「名稱=值」逐行寫下的純文字檔,程式啟動時由套件讀進來(Anthropic 的說明以 Python 的 python-dotenv 套件為例)。內容大概長這樣:

MY_SERVICE_API_KEY=這裡放你的金鑰

.env 檔方便,但它本身就是一個「金鑰明文存在硬碟上」的檔案,所以一定要讓 Git 忽略它。做法是在專案的 .gitignore(告訴 Git 哪些檔案不要追蹤的清單)裡加一行:

.env

這裡有一個 Git 官方文件寫明、但很多人不知道的細節:.gitignore 對已經被追蹤的檔案無效。如果你在加進 .gitignore 之前就已經提交(commit,把檔案目前的內容存成 Git 的一筆紀錄)過 .env,它會繼續被追蹤。所以要在第一次提交之前就設好,並用下面這個指令確認 Git 真的忽略了它。指令印出 .env,代表它已被忽略;什麼都沒印,代表沒有被忽略,或它早就被追蹤了:

git check-ignore .env

Git 的基本觀念(儲存庫、commit 也就是一次提交紀錄、為什麼「刪掉檔案」不等於「從歷史消失」),請看 給 AI 使用者的 Git 入門。

環境變數也不是保險箱

環境變數解決的是「金鑰跟著程式碼外流」的問題,不是加密。用你的帳號執行的程式,通常都讀得到你的環境變數;Claude Code 的沙箱文件也明確寫出,沙箱裡執行的指令預設會繼承環境變數,包括其中的祕密。所以下一節的幾道防線一樣重要。

再多三道防線:分開金鑰、用量上限、定期輪替

這三點出自 Anthropic 與 OWASP(一個專注於軟體安全的開放社群)的建議,原則上適用於各家服務;具體設定位置請以你使用的服務為準。

  1. 依用途分開金鑰:開發、測試、正式環境各用一把;不同的專案、不同的工具也各用一把。其中一把外洩時,只停用那一把,其他用途不受影響。這也是 最小權限原則 的應用:OWASP 指出,建立祕密時就應該只給它完成用途所需的最少權限。
  2. 設定用量或花費上限:Anthropic 的說明指出,上限能在金鑰外洩或程式出錯時,防止意外的大量用量。它不能防止外洩,但能限制外洩的損失。
  3. 定期輪替:金鑰輪替(Key rotation)是定期建立新金鑰、換到使用的地方,再停用舊金鑰。OWASP 的理由是:輪替讓被偷走的憑證只在短時間內有效。

最後,可以讓工具幫你把關。祕密掃描(Secret scanning)是自動在程式碼與 Git 歷史中尋找金鑰、密碼等祕密的機制。以 GitHub 為例,它會掃描儲存庫所有分支的完整 Git 歷史;它的推送保護(Push protection)更進一步:推送(push)是把你電腦上的提交上傳到遠端儲存庫,推送保護會在含有祕密的推送到達儲存庫之前就擋下來。Anthropic 也說明,它參與了 GitHub 的祕密掃描合作:在公開儲存庫裡被發現的 Anthropic 金鑰,會被自動停用並通知使用者。

不過,這類合作只涵蓋特定的服務商與情境,不要把它當成唯一的保護。

金鑰外洩時的處理步驟

下面的順序是本站依 OWASP 的事件處置建議與 GitHub 文件整理的,不是官方標準。關鍵只有一句:先讓它失效,再處理其他事情。

  1. 立刻撤銷那把金鑰:到服務商的後台停用或刪除它。這是唯一能確定「別人拿到也不能用」的方法,所以排第一,不要等查清楚原因再做。
  2. 建立新金鑰,換到原本使用的地方:更新環境變數或祕密儲存,確認你的程式恢復正常。
  3. 檢查用量與紀錄:看外洩期間有沒有你不認得的用量。費用有異常時,聯絡服務商。
  4. 清理外洩的位置:刪掉那則留言、那張截圖、那段對話。如果金鑰被提交到 Git,GitHub 的文件說明:金鑰撤銷或輪替之後就無法再使用,這樣可能就已足夠;改寫 Git 歷史需要協調所有複製過儲存庫的人,而且已經被複製(fork 或 clone)的副本你無法清除。
  5. 找出原因,補上防線:是忘了 .gitignore?是截圖沒檢查?把對應的預防做法補上,並考慮開啟祕密掃描。

常見的錯誤是反過來做:先急著把 commit 刪掉、把儲存庫改成私人,卻沒有撤銷金鑰。GitHub 的文件特別提醒,提交過的祕密在從最新版本移除後,仍然存在於 Git 歷史裡;只刪檔案,金鑰其實還能用。

一張表整理

你想做的事建議做法
讓程式使用金鑰從環境變數讀取,程式碼裡不寫金鑰
在自己的電腦上開發用 .env,第一次提交前加進 .gitignore 並確認
給 AI 代理使用金鑰不放在它能讀的資料夾裡,或設定禁止讀取
網頁要呼叫 AI 服務由你的伺服器呼叫,瀏覽器端不放金鑰
多個專案、多個人各用各的金鑰
避免帳單失控設定用量或花費上限,定期看用量
懷疑外洩先撤銷,再換新、查用量、清理

接著看什麼

常見問題

API Key 和密碼有什麼不同?

密碼是你登入帳號時輸入的;API Key 是給程式用的,會附在每一次請求裡,讓服務直接認定請求來自你的帳號。也因為它是給程式用的,你可以替不同用途各建一把,出事時只停用那一把,不必動到帳號密碼。

API Key 外洩會怎樣?

拿到金鑰的人可以用你的帳號呼叫服務,費用算在你頭上,Anthropic 的官方說明就把它比喻成信用卡號。視服務而定,對方也可能讀到或改動這把金鑰權限範圍內的資料。

不小心把金鑰提交到 Git,刪掉那個 commit 就好了嗎?

不夠。GitHub 的文件說明,提交過的祕密會留在 Git 歷史裡,也可能已經跟著分支、被複製的儲存庫或自動化流程的紀錄擴散出去。正確順序是先撤銷並換新金鑰,舊金鑰失效後,留在歷史裡的那串字也就不能用了。

可以把金鑰貼給 AI,請它幫我除錯嗎?

不建議。貼進對話的文字會成為對話紀錄的一部分,等於多了一個可能外洩的地方;AI 幫你除錯通常只需要知道「有沒有設定這個環境變數」,不需要看到金鑰本身。如果已經貼了,就把那把金鑰當作外洩處理。

把金鑰放在環境變數裡就絕對安全嗎?

不是絕對。環境變數的好處是金鑰不會跟著程式碼被提交,但用你的帳號執行的程式,包括它啟動的子程式,通常都讀得到;Claude Code 的文件也指出,沙箱裡的指令預設會繼承這些環境變數。所以仍然要搭配分開金鑰、用量上限與定期輪替。

金鑰多久要換一次?

沒有一體適用的答案。OWASP 建議定期輪替,讓被偷走的金鑰只在短時間內有效;Anthropic 的建議以每 90 天為例。比定期更重要的是:只要懷疑外洩,就立刻換。

留言

用 GitHub 帳號登入就能留言,留言會公開顯示在 GitHub Discussions。留言前請先看社群規則。

從這裡開始