Tools mentioned in this article
Open the browser-based tool while you read and try the workflow immediately.

「我們把密碼用 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)。