文章
在本機私密地編碼與解碼資料
開發者每天把權杖、酬載與憑證貼進編碼與解碼頁面。最方便的那些在伺服器上執行,這代表為了一件本不需要如此的工作,你的資料離開了裝置。這四個工具完全在瀏覽器中執行,所以資料留在你手中。
Base64:看起來雜亂,其實並不保密
Base64 是一種編碼,不是加密。它把二進位資料轉成文字,使其能承受複製貼上,或穿過只處理簡單字元的系統。任何看到 Base64 字串的人都能一步把它解回原樣,因此一段含有 API 金鑰、私有憑證或郵件內文的字串,對持有者而言完全可讀。風險在於這個值常藏在設定檔、data URL 或認證標頭裡,看起來晦澀,因而誘使人把它貼進網路上找到的第一個解碼器。那個解碼器拿到的是原始的祕密。一個在本機解碼 Base64 的工具會向你顯示原始位元組,而這個值從不抵達任何伺服器。

URL 編碼:查詢字串攜帶的東西比你以為的多
百分比編碼讓你能把空格、重音符號與保留字元安全地放進 URL。你編碼或解碼的文字往往是來自某個應用程式的真實查詢字串,它們攜帶工作階段識別碼、搜尋詞、電子郵件位址、轉址目標,有時還有簽章參數。把完整的 URL 貼進遠端編碼器,會把這一切一次交給第三方,而查詢字串正是那種會落進伺服器記錄的值。在瀏覽器中編碼與解碼,代表 URL 在你自己裝置的記憶體中處理,在你操作期間從不被傳輸。
JWT:酬載是被簽章,而非被隱藏
一個 JSON Web Token 由以點連接的三段 Base64url 組成:標頭、酬載與簽章。簽章證明權杖未被竄改,卻完全不會隱藏酬載,酬載會解碼成可讀的 JSON,含有使用者識別碼、角色、到期時間,以及簽發者加入的任何自訂宣告。有效的權杖同時也是一份活的憑證:在到期之前,任何持有它的人都能以該使用者的身分行事。把可用的權杖貼進線上解碼器,就把一份有效憑證送往了你無法掌控的伺服器。一個在你瀏覽器中剖析權杖的解碼器,會顯示同樣的標頭與酬載,而這個權杖從不離開頁面。

雜湊:輸入比摘要更重要
雜湊函式把任意輸入變成固定長度的摘要,而你無法把摘要逆推回輸入。這個性質讓雜湊適合用來驗證檔案完整性,或在不保存原件的情況下比較數值。陷阱在輸入這一端:要計算一個密碼、一份文件或一個設定祕密的雜湊,你必須把真實的值交給工具。如果這個工具在伺服器上執行,即使回傳的只是無害的摘要,敏感的輸入也已經送到了那裡。在本機計算雜湊會把輸入留在你的裝置上,於是你得到所需的摘要,卻不暴露你正在雜湊的東西。
Base64 編碼:位元組映射與填充
Base64 透過將三個輸入位元組(24 位元)分組為四個 6 位元值,將 8 位元位元組轉換為 6 位元字元。每個 6 位元值映射到 Base64 字母表中的一個字元(A-Z、a-z、0-9、+、/)。由於此過程要求輸入為 24 位元的倍數,不足的輸入會進行填充:剩餘一個位元組產生兩個填充字元(==),剩餘兩個位元組產生一個(=)。Base64url 變體用於 JSON Web Tokens(JWTs),將 + 替換為 -,/ 替換為 _,使字串對 URL 安全,並完全省略 = 填充,因為填充字元可能在嚴格的 URI 解析器中造成錯誤。在偵錯令牌處理時,識別這一區別很重要:看似格式錯誤的 JWT 可能只是使用 Base64url 編碼而非標準 Base64。
JWT 簽署:HS256、RS256 與演算法混淆
JSON Web Token 的安全性完全取決於其簽署,即以點分隔的第三個段落。使用 HS256(HMAC-SHA256)時,伺服器使用密鑰對 Base64url 編碼的標頭和負載進行簽署。SHA-256 雜湊函數提供抗碰撞性:在不知道密鑰的情況下,生成一個能雜湊出相同簽署的修改負載在計算上是不可行的。使用 RS256 時,伺服器使用 RSA 私鑰進行簽署,並以公鑰進行驗證。當伺服器函式庫未嚴格強制執行預期的演算法類型時,便會出現一種稱為演算法混淆的已知漏洞。攻擊者可以將令牌標頭的 alg 欄位從 RS256 改為 HS256,並使用伺服器的公鑰作為 HMAC 密鑰對令牌進行簽署,因為公鑰通常是可存取的。在瀏覽器本機解碼 JWT 標頭讓您能夠驗證實際指定的演算法,而不會將有效令牌暴露給第三方記錄系統。
本文涉及的工具
常見問題
Base64 或 URL 編碼算是一種安全手段嗎?
不算。兩者都是可逆的編碼,為安全傳輸資料而設計,並非用來保護資料。任何能讀到編碼字串的人都能立刻解碼,不需金鑰或密碼。如果你需要讓某個值保密,請用合適的演算法加密它,並把金鑰單獨管理。把任何 Base64 或百分比編碼的值都當作以明文寫就的來對待。
我在哪裡解碼權杖或雜湊密碼,為什麼會有差別?
因為敏感的部分是輸入。有效的 JWT 是一份活的憑證,而你雜湊的密碼就是真正的祕密。以伺服器為基礎的工具在回傳結果之前就已收到那份原始輸入,這代表副本可能被寫入記錄,或被保存在你看不到的地方。在你瀏覽器中執行的工具,會在你自己裝置的記憶體裡完成同樣的操作,所以權杖或密碼從不被送往任何地方。