編碼、雜湊、加密差異示意圖

「我們把密碼用 Base64 存起來」——這句話背後是一個嚴重的資安誤解。編碼、雜湊、加密這三者都是把字串轉換成另一種形式,但目的完全不同,混為一談可能導致資料外洩或系統缺陷。

這篇文章用比較表與具體範例把三者的差異整理清楚,讓您在各種情境下都能選對方法。

先講結論:三者的差異

目的能還原嗎?需要金鑰嗎?代表範例
編碼將資料轉成另一種表現形式可以(任何人都行)不需要Base64、URL 編碼
雜湊產生固定長度的「指紋」(單向)不行不需要SHA-256、HMAC
加密保密,只有獲授權者能還原可以(需要金鑰)需要AES、RSA

重點是:編碼完全不具保密性雜湊無法還原只有加密才是「守護秘密」的機制

編碼:為了可讀性與相容性而做的轉換

編碼只是把資料換成「另一種表現方式」而已。不需要金鑰、不需要密碼,任何人都能還原,完全不具備保密功能。

例如 Base64,就是用來把二進位資料或特殊字元安全地以文字形式傳遞的方式。

Hello, World!   →(Base64 編碼)→   SGVsbG8sIFdvcmxkIQ==

SGVsbG8sIFdvcmxkIQ== 乍看像亂碼,但只要貼到 Base64 轉換工具,任何人都能立刻還原成原始字串。用來在 URL 中放入中文或符號的 URL 編碼 也是同一類。

常見誤用: 把 API 金鑰或密碼做 Base64 編碼、以為就「藏起來」了,這其實很危險。Base64 不是加密,對保密完全沒有幫助。

雜湊:單向的「指紋」

雜湊是從輸入資料計算出固定長度數值(摘要)的單向轉換。相同輸入必定產生相同的雜湊值,但無法從雜湊值還原出原始資料。

password123   →(SHA-256)→   ef92b778bafe771e89245b89ecbc08a44a4e166c06659911881f383d4473e94f

輸入只要有一點點變化,輸出就會截然不同。基於這個特性,雜湊常用於:

  • 密碼儲存:不存明文,只存雜湊值,登入時比對輸入值的雜湊(實務上還會搭配 salt 與 bcrypt/Argon2)
  • 竄改偵測、完整性檢查:比對檔案或訊息的雜湊值,確認內容是否被更動
  • 簽章的一部分JWT 的簽章或 HMAC 用來保證資料未被竄改

雜湊產生工具 試試 SHA-256 或 HMAC,就能親眼看到輸入一改變、輸出就完全不同的樣子。

重點: 「無法還原」正是雜湊的本質,也正因如此才適合用來儲存密碼。反過來說,任何之後還需要取回原始資料的場景都不能用雜湊。

加密:用金鑰保護、可以還原的秘密

加密是利用金鑰把資料轉換成無法讀取的形式,只有持有正確金鑰的人才能解密。與編碼不同,沒有金鑰就無法還原;與雜湊不同,有金鑰的話就能還原。這是唯一真正能「守護秘密」的方式。

  • 對稱式加密(AES 等):加密與解密使用同一把金鑰,速度快,常用於資料儲存加密等場景
  • 非對稱式加密(RSA 等):用公鑰加密、私鑰解密,用於金鑰交換或數位簽章

HTTPS 通訊、資料庫的靜態加密、機密檔案保護,全都屬於加密的範疇。金鑰管理(不外洩、妥善保管)直接決定了整體的安全性。

使用情境速查表

想做的事該用什麼
想在 URL 或 JSON 中安全放入特殊字元編碼(Base64/URL 編碼)
想安全地儲存密碼雜湊(bcrypt/Argon2,含 salt)
想確認檔案是否被竄改雜湊(SHA-256)
想讓資料保密、但之後還能還原加密(AES/RSA)
想防止通訊內容被竊聽加密(TLS/HTTPS)
想驗證權杖(token)是否被竄改以雜湊為基礎的簽章(HMAC/JWT)

常見的錯誤做法

  • 用 Base64「假裝加密」:如前所述,完全不具保密性,不能用來保護機密資訊
  • 把密碼加密後儲存:能解密,代表金鑰一旦外洩,所有密碼就全部暴露。密碼本來就不需要解密,所以雜湊(含 salt)才是正解
  • 只用單純的 SHA-256 儲存密碼:計算速度太快,容易被暴力破解,也可能遭受 rainbow table 攻擊。應搭配 salt,並使用刻意設計得較慢的演算法,例如 bcrypt 或 Argon2
  • 自行實作加密演算法:加密務必使用經過驗證的標準函式庫,自行實作幾乎必定存在漏洞

總結

三者名稱相似,角色卻完全相反:編碼只改變外觀(不具保密性)、雜湊是無法還原的指紋、加密是用金鑰保護、可還原的秘密。只要掌握這個區別,就能自然而然地做出正確選擇——密碼用雜湊、通訊用加密、URL 用途用編碼。想親自確認實際行為的話,歡迎實際試用 Base64 轉換雜湊產生JWT 解碼

常見問題

為什麼 Base64 不算加密?

因為 Base64 不使用金鑰,而且轉換規則是公開的,任何人都能立刻還原。由於完全不具備保密要素,它被歸類為編碼(表現形式的轉換),而不是加密,不能用來隱藏機密資訊。

密碼應該用雜湊還是加密來儲存?

用雜湊。密碼本來就「不需要之後再解密」,因此適合使用單向雜湊(搭配 salt 的 bcrypt 或 Argon2)。如果改用加密儲存,一旦解密金鑰外洩,所有密碼就會一次曝光。

雜湊真的完全無法還原嗎?

就計算上而言,無法從雜湊值反推出原始資料。不過,常見密碼可能被事先計算好的 rainbow table 比對出來,因此為每位使用者加上不同的 salt、並使用能抵抗暴力破解的慢速演算法,就格外重要。

JWT 的權杖有加密嗎?

一般的 JWT(帶簽章的 JWS)是簽章,而不是加密。Payload 只是經過 Base64URL 編碼,任何人都能用 JWT 解碼工具 讀出內容。簽章的作用是偵測竄改,因此絕對不要把機密資訊直接放進 JWT。如果需要保密,請改用加密(JWE)。