上一篇我們聊了雜湊(Hash),知道它是「單向」的,資料進去就回不來了。
這篇要來聊的是編碼(Encode),它跟雜湊最大的不同就是:編碼是雙向的,可以過去,也可以回來。
在做權限驗證的時候,編碼也是一個很常出現的觀念。如果你搞不清楚編碼跟雜湊的差別,後面在看 Token、JWT 這些東西的時候,很容易會搞混。
這篇文章一樣用最白話的方式,讓你搞懂編碼到底是什麼。
編碼是什麼?
用語言翻譯來理解
編碼的概念,可以用「語言翻譯」來理解。
想像一下:
- 英文可以翻譯成日文
- 日文可以翻譯成中文
- 中文也可以翻譯回英文
這種可以互相轉換的過程,就是編碼的概念。
實際上怎麼運作?
你有一份資料,透過某種編碼方式(Encode),把它轉換成另一種格式。
原始資料 ──→ Encode(編碼) ──→ 編碼後的資料
編碼後的資料 ──→ Decode(解碼) ──→ 原始資料重點是:它可以過去,也可以回來。這就是編碼跟雜湊最大的差別。
為什麼需要編碼?
不同情況需要不同的呈現方式
有時候,同樣一份資料,在不同的地方需要用不同的方式來呈現或儲存。
舉個例子:
- 在瀏覽器上,你想要顯示一張圖片
- 但在資料庫裡,你可能想要用文字的方式來儲存這張圖
這種時候,就需要用到編碼。
常見的應用場景
- 把圖片轉成文字儲存
- 在網址中傳遞特殊字元
- 在不同系統之間傳遞資料
常見的編碼方式
Base64 編碼
Base64 是最常見的編碼方式之一。
它能做什麼?
不管你的檔案是什麼格式,透過 Base64 編碼之後,都會變成一串由以下字元組成的字串:
- 大寫英文:A-Z(26 個)
- 小寫英文:a-z(26 個)
- 數字:0-9(10 個)
- 符號:
+和=(2 個)
加起來總共 64 個字元,所以叫做 Base64。
實際範例
假設你有一張大頭貼,透過 Base64 編碼之後,它會變成像這樣的一串文字:
SGVsbG8gV29ybGQhIQ==怎麼認出 Base64?
一個小技巧:如果你看到一串文字,結尾有 = 或 ==,很大的機會就是 Base64 編碼的內容。
常見用途
Base64 很常用在小型圖片的處理,像是大頭貼。
為什麼?因為大頭貼通常很小張,如果每次都要另外載入一張圖片檔,會比較慢。但如果把它轉成 Base64 的文字,就可以直接嵌在網頁裡面,載入速度會更快。
Hex 編碼(16 進位編碼)
另一種常見的編碼方式是 Hex 編碼,中文叫做「16 進位編碼」。
它能做什麼?
Hex 編碼會把資料轉換成由以下字元組成的字串:
- 數字:0-9(10 個)
- 英文:A-F(6 個)
加起來總共 16 個字元,所以叫做 16 進位。
實際範例
同樣一張圖片,透過 Hex 編碼之後,會變成像這樣:
48656C6C6F20576F726C6421Base64 vs Hex:該用哪一個?
主要差別:長度
同樣一份資料:
- 用 Hex 編碼:會變成比較長的字串
- 用 Base64 編碼:會變成比較短的字串
這是因為 Base64 可以用的字元比較多(64 個 vs 16 個),所以「壓縮率」比較高。
一般情況下
大部分情況會使用 Base64,因為產生的字串比較短,傳輸和儲存都比較有效率。
重點整理
來複習一下這篇講的重點:
- 編碼是雙向的,可以 Encode 過去,也可以 Decode 回來
- 編碼的目的是在不同情況下用不同方式呈現資料
- Base64 是最常見的編碼方式,結尾常常有
=或== - Hex(16 進位) 也是常見的編碼方式,但字串會比較長
- 編碼不是加密,任何人都可以輕易解碼回來
編碼 vs 雜湊
最後再強調一次兩者的差別:
| 特性 | 雜湊(Hash) | 編碼(Encode) |
|---|---|---|
| 方向 | 單向,回不去 | 雙向,可以回來 |
| 目的 | 驗證、保護資料 | 轉換格式 |
| 安全性 | 有一定保護作用 | 沒有保護作用 |
記住:編碼不是拿來保護資料的,任何人只要知道你用什麼編碼方式,就可以輕鬆解碼回來。
最後
搞懂編碼之後,你就已經了解「雜湊」和「編碼」這兩個觀念了。
下一篇我們會聊到「加密(Encrypt)」,這三個東西很容易搞混,但它們是完全不同的概念。
把這三個都搞懂,後面在做權限驗證的時候就會清楚很多!