編碼 vs 加解密 vs 雜湊
這裡有三筆資料
- U2FsdGVkX19FJsgVyam+Gh2EwmGs4BEJjJJsWxCXHWw84gp3uHvozWsHY8gfAx0C
- VG9kYXkgaXMgYSBnb29kIERheQ==
- 046a484a529ecfc7693753ee65802b5cfcafd548252d0e5f1bca845ad2208b91
對應說明:
- 第一行:對稱式加密(例如 AES)後的密文樣式
- 第二行:Base64 編碼字串
- 第三行:SHA-256 雜湊值(hex)
這三個東西看起來都是亂碼,但所代表的含意完全不一樣。
本文整理三者的特性與差異。
此文同步發布 Blog [淺談] 編碼(encoding) vs 加解密 vs 雜湊(Hash)
前言
會想分享這篇文章是因為常有人把
- 編碼(encoding)
- 加解密
- 雜湊(Hash)
這三個東西搞混,尤其是把編碼當作加密....這是非常危險的事情.
編碼 != 加密(兩者完全不同)
編碼(Encode)
說明:
這邊用 Base64 編碼來介紹,我們可以看到下圖資料轉換是雙向的。
Hello Daniel => SGVsbG8gRGFuaWVs
如果我們想要把 SGVsbG8gRGFuaWVs 變回 Hello Daniel,只需進行 Base64 解碼即可。

編碼是將原始資料經運算轉換成另一組資料;若要還原,需再進行解碼。
用途:
在網路傳輸會使用到編碼,主要是資料在傳輸時有些特殊字元具有特殊用途(例如 HTTP 查詢參數中的 &)。
這時就可先將資料編碼,避免與協定保留字元衝突。
如果想要了解 Base64 原理和演算法的話可以看我另一篇【深入淺出】Base 編碼 (Base64 為例子)
加解密 (Encryption/Decryption)
說明:
這邊以 AES 來介紹,我們可以看到下圖資料轉換是雙向,但會透過一個金鑰(Key)來做轉換(這是和編碼最大的差別)。

要還原成原始資料,我們只能透過相同的金鑰(Key)才可以達成,就像一個寶箱只有唯一一把鑰匙可以打開一樣。
這邊補充一個簡單加密法(凱薩密碼),它是使用字元位移的數字來當作金鑰(Key)。
如果位移數量是 1 ABCD => BCDE
如圖
用途:
加密可以確保資料的安全性(只有相同的金鑰(Key)才可還原成原本資料),很適合用在機密資料且需要還原使用。
雜湊(Hash)
說明:
這裡用 SHA-256 來當作範例
Hash 有幾個特點
- 不管資料量多大,經過 SHA-256 運算字串長度皆為固定。
- 名稱中的 256 指輸出長度為 256 bit(32 bytes,常見表示為 64 位十六進位字串)。
- 是一個「不可逆」的演算法,所以箭頭是單向。
- 相同輸入用相同演算法計算,輸出一定相同。
一定會有小夥伴好奇,運算完都是固定長度 那會不會出現一個情況,原始資料不一樣但算完
Hash結果是一樣的會, 這個我們稱之為雜湊碰撞 這個機率很小
用途:
一般會把使用者密碼經 Hash 運算後再存入資料庫,當作不可逆的辨識依據(像指紋)。下次使用者登入時,再用同一 Hash 演算法計算並比較以驗證身分。
小結
對於這邊有一個簡單的比較表格
- 編碼(encoding)
- 加解密
- 雜湊(Hash)
| 資料是否可以還原 | 運算後資料長度 | 安全性 | |
|---|---|---|---|
| 雜湊 | 不可 | 固定 | 高 |
| 編碼 | 可 | 不一定 | 低 |
| 加解密 | 可 | 不一定 | 高 |
加解密和編碼最常被誤會的地方,是以為使用 Base64 編碼就很安全(事實上只要知道你用的是編碼,就能還原成原始資料)。