Basic Auth 生成器

根據使用者名稱和密碼生成 HTTP Basic 認證請求頭,提供可直接貼上的 curl 命令,並支援把已有的 Basic 令牌解碼回憑據。

生成 HTTP Basic 認證請求頭,或把已有的解碼回來。 輸入使用者名稱和密碼,即可得到 Authorization 請求頭、原始 base64 令牌,以及可直接粘進終端的 curl 命令。下方的解碼器可以反向還原已有令牌。

解碼已有令牌

所有計算都在你的瀏覽器中完成,不會傳輸任何資料。即便如此,也請不要把生產環境憑據貼上到任何網頁,包括本頁。

HTTP Basic 認證的真實工作方式

機制本身

Basic 認證由 RFC 7617 定義,是 HTTP 中最簡單的認證方案。客戶端用冒號把使用者名稱和密碼連線起來,對結果做 base64 編碼,然後放進請求頭:

Authorization: Basic YWxpY2U6czNjcjN0

當伺服器需要憑據時,會返回 401 Unauthorized 並帶上 WWW-Authenticate: Basic realm="...",瀏覽器隨即彈出原生登入框。整個過程沒有握手、沒有隨機數、沒有有效期 —— 每個請求都攜帶同一個請求頭。

base64 不是加密

這一點必須刻進腦子裡。base64 是一種可逆的傳輸編碼,既沒有金鑰也沒有秘密可言。任何看到這個請求頭的人都能瞬間解出內容,本頁的解碼器做的正是這件事。因此 Basic 認證本身提供的機密性是,只能在 HTTPS 之上使用,由 TLS 保護整個請求。跑在明文 HTTP 上,它等價於直接傳送明文密碼。

冒號規則

使用者名稱中不能包含冒號,因為第一個冒號就是分隔符。密碼裡想有多少冒號都可以 —— 解碼器只在第一個冒號處切分,其餘全部算作密碼。如果你的使用者名稱確實需要冒號,那麼 Basic 認證不可用,得換方案。

字元編碼

最初的規範對 ASCII 之外的字元語焉不詳,歷史上導致非 ASCII 密碼在客戶端與服務端之間頻繁出錯。RFC 7617 增加了 charset="UTF-8" 引數,讓伺服器可以宣告自己的預期;實踐中現代技術棧一律使用 UTF-8。本工具在 base64 之前先編碼為 UTF-8 位元組,與當前瀏覽器行為一致。

它仍然合適的場景

Basic 認證在這些場合依然合理:內網中的機器對機器呼叫;用 nginx 或 Apache 快速給預釋出環境加一道門;需要簡單憑據的 CI 任務;以及作為 API Key 的載體 —— 把 key 放進使用者名稱欄位,密碼留空或填一個佔位符如 x。多家支付和郵件 API 用的正是這種模式。

它不適合公開站點的終端使用者登入:沒有登出機制,瀏覽器會在會話期內快取憑據,彈框無法定製樣式,也沒法加多因素認證或按會話限流。這類場景應改用令牌或會話方案。

實踐中的注意事項

寫在 URL 裡的憑據 —— user:pass@example.com —— 已被廢棄,多數瀏覽器會攔截或剝離,因為它會洩漏進歷史記錄、日誌和 referrer 頭。給 curl 傳 -u user:pass 同樣會把密碼寫進 shell 歷史和程序列表,機器上的其他使用者能直接看到;更好的做法是隻寫 -u user 讓 curl 提示輸入,或者從環境變數讀取。

開源說明:依據 RFC 7617,使用標準 btoaatobTextEncoderTextDecoder API 實現,未使用第三方庫。

常見問題

Basic 認證安全嗎?
只有在 HTTPS 上才安全。base64 編碼不提供任何保護,可以輕易還原。有 TLS 時,憑據像其他請求資料一樣在傳輸中受保護;沒有 TLS 時,它實際上就是明文。
既然不是加密,為什麼還要 base64?
它的目的是傳輸安全而非保密。base64 保證憑據只包含請求頭安全的 ASCII 字元,這樣密碼裡的冒號、空格或非 ASCII 位元組就不會破壞請求頭。
使用者名稱能包含冒號嗎?
不能。第一個冒號用於分隔使用者名稱和密碼,使用者名稱裡出現冒號會讓憑據產生歧義。密碼則可以包含任意數量的冒號。
怎麼退出 Basic 認證?
沒有正經的機制。瀏覽器會在會話期內快取憑據,常見的繞法是關閉瀏覽器,或讓某個特殊端點返回 401。這個限制正是 Basic 認證不適合終端使用者登入的原因之一。
令牌會過期嗎?
永遠不會。只要密碼不變,同一個請求頭就一直有效,所以洩漏一個 Basic 令牌和洩漏密碼一樣嚴重。一旦暴露就應立即輪換憑據。
我的憑據會被髮送出去嗎?
不會。編碼和解碼全部在你的瀏覽器中完成。不過仍然建議:永遠不要把真實的生產憑據貼上到任何網頁。