主要是想簡單講一下這三者的差別,因為實在看過太多網站把這三者混淆了。
前言
base64 加密?base64 壓縮?base64 編碼?傻傻分不清?
究竟:
- 加密(Encrypt)
- 壓縮(Compress)
- 編碼(Encode)
到底有什麼差別?
明明不管是中文還是英文,
這 3 個詞長得一點都不像,
那到底為什麼很多人會把這 3 種東西都當成加密呢?
主要是因為透過這 3 種方式處理過後的資料,
都會長的跟原本不一樣,
一般人無法直接辨別,
就覺得是被加密處理過的密文天書。
然而,
並不是變成人看不懂的東西就叫作「加密」。
如果誤用的話,
很有可能你自以為加密了的東西,
實際上並沒有經過加密處理,
隨隨便便就可以被懂其中差異的人拿到你寶貴的原始文字(最有可能的就是你的密碼啦)。
以下就來簡單說明這 3 種東西各自的特性,
會特別拿 base64 來說,
希望能夠端正一下視聽。
加密(Encryption)
- 特性
- 首先得產生一個新的字串作為密鑰,也就是一把鑰匙。
- 原文與密鑰作為加密演算法的輸入,得到的輸出即為加密過後的密文。
- 可以想像成,加密演算法幫你打造出你給它的這把密鑰才可以開啟的寶箱,幫你把原文放入寶箱後,用這把密鑰上鎖,上鎖後的寶盒就是密文,看不到裡面的東西是什麼。
- 這種只有一把鑰匙的加密演算法被稱為對稱式加密(Symmetric Encryption)。
- 問題也很明顯,要是你沒有保管好你的鑰匙,或者你的鑰匙構造太簡單被人打造出一模一樣的鑰匙,別人就可以打開寶箱,拿到內容物。
- 比如說你的密鑰是一個叫作 "5566" 的字串,因為太好猜了,所以很容易被解密回來。
- 這也是為什麼通常在生成密鑰的時候會建議長度愈長愈好,尤其現在電腦的運算能力愈來愈強,以往透過程式一個一個暴力猜測密鑰的方式,在相同單位時間內可以猜的數量變多了,密鑰長度太短的話,很容易就被猜到。
- 因為對稱式加密的安全性以及在實際應用上不夠理想,於是乎,出現了安全性更高,應用範圍更廣的非對稱式加密(Asymmetric Encryption)。
- 非對稱式加密演算法會有兩把鑰匙,一把稱做公鑰(可以公開),另一把稱做私鑰(自己要藏好)。
- 非對稱式加密除了可以做到加密以外,還可以生成數位簽章,確認密文的傳送方身份真的是本人,這篇不會細談。
- 但這並不代表對稱式加密就沒有人用,兩者各有各的優缺點,所以實際應用上通常都是視情況而定,常常會有兩者一起使用的情形。
- 常見演算法
- 對稱式:DES, 3DES, AES
- 非對稱式:RSA, DSA, ECC
- 結論
- 沒有這把鑰匙(無論是拿到或猜到)就無法得知真正的訊息。
- 使用 base64 的時候不需要密鑰,而且任何人編碼的 base64 訊息,任何人都可以經過 base64 解碼回來,所以 base64 不是加密。
壓縮(Compression)
- 特性
- 輸入(通常是檔案)經過壓縮演算法後得到的輸出,大小比輸入來得小。
- 根據有無失真又區分為非破壞性(無損)壓縮與破壞性(有損)壓縮:
- 無損壓縮:無失真、壓縮率沒辦法到太高,通常用在文件檔案這種不能缺少原始資料的東西。
- 有損壓縮:失真、壓縮率可以比較高,通常用在圖片、視訊、音訊,因為可以去掉人眼或人耳無法辨認出差異的部份,降低檔案大小可以有效提升傳輸時的效率。
- 常見演算法
- zip, gzip, rar, 7zip, jpg, mp3, mp4, Huffman coding
- 結論
- 沒有讓輸出比輸入小的演算法就不是壓縮。
- 經過 base64 編碼後得到的結果,實際上會比原檔案多三分之一左右,所以 base64 不是壓縮。
- base64 使用 64 個可顯示的 ASCII 字元來表示二進位資料。
2^6 = 64
,也就是一個 base64 單元表示 6 位元,即用 1 個 ASCII 字元(8 bits),表示 6 bits 資料,比例為4:3
,也就大概多了1/3
出來。
- 那為什麼很多地方會提到在網頁上用 base64 表示圖片可以加速?
- 主要是因為把圖片直接以 base64 字串的形式呈現在網頁上的話,就不需要額外再發 request 去要圖片。
- 但因為 base64 會把檔案變大不少,所以很多人會先把圖片經過 gzip 壓縮後,再編碼成 base64 字串。
編碼(Encoding)
編碼牽涉的範圍非常廣,
包含了:字元編碼(Character Encoding)、音訊編碼(Audio Encoding)、視訊編碼(Video Encoding)、…… 等等,
所以在這篇文章不會仔細講。
其實廣義上來說,
上述提到的加密與壓縮都算是編碼的其中一種,
但這裡就把上述兩個排除。
- 特性
- 將原文轉換成另外一種表達方式。
- 不需要密鑰,只要知道你用哪個編碼演算法,任何人都可以解碼。
- 這也是單純編碼被拿來誤用成加密演算法最危險的地方,因為完全不需要花時間猜密鑰。
- 不同的編碼演算法有不同的特性
- 錯誤偵測(Error Detection)
- 檢查訊息在經過傳送後是否已經改變。
- 錯誤校正(Error Correction)
- 自動修正在經過傳送後錯誤的內容。
- 方便資料進行傳輸
- 以不同的形式表示相同的資料。
- 例如: base64 就把二進位的資料用 ASCII 來表示。
- 錯誤偵測(Error Detection)
- 常見演算法
- base64, urlencode, hamming code,
結論
- 有密鑰:加密
- 輸出比輸入小:壓縮
- 其他:編碼
Share
Donation
如果覺得這篇文章對你有幫助, 除了留言讓我知道外, 或許也可以考慮請我喝杯咖啡, 不論金額多寡我都會非常感激且能鼓勵我繼續寫出對你有幫助的文章。
If this blog post happens to be helpful to you, besides of leaving a reply, you may consider buy me a cup of coffee to support me. It would help me write more articles helpful to you in the future and I would really appreciate it.
Related Posts
- 加密和雜湊有什麼不一樣?
- 嘗試在 Python 中做到 Golang fmt 的效果
- Linux 上如何透過指令更改鍵盤鍵位
- 《回答的智慧》
- 關於 Django 的 F() expressions, Q object, Aggregation 的一些筆記