Skip to main content

編碼 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)來做轉換(這是和編碼最大的差別)。

img

要還原成原始資料,我們只能透過相同的金鑰(Key)才可以達成,就像一個寶箱只有唯一一把鑰匙可以打開一樣。

這邊補充一個簡單加密法(凱薩密碼),它是使用字元位移的數字來當作金鑰(Key)。

如果位移數量是 1 ABCD => BCDE

如圖

img

用途:

加密可以確保資料的安全性(只有相同的金鑰(Key)才可還原成原本資料),很適合用在機密資料且需要還原使用。

雜湊(Hash)

說明:

這裡用 SHA-256 來當作範例

Hash 有幾個特點

  1. 不管資料量多大,經過 SHA-256 運算字串長度皆為固定。
  2. 名稱中的 256 指輸出長度為 256 bit(32 bytes,常見表示為 64 位十六進位字串)。
  3. 是一個「不可逆」的演算法,所以箭頭是單向。
  4. 相同輸入用相同演算法計算,輸出一定相同。

一定會有小夥伴好奇,運算完都是固定長度 那會不會出現一個情況,原始資料不一樣但算完Hash結果是一樣的

會, 這個我們稱之為雜湊碰撞 這個機率很小

用途:

一般會把使用者密碼經 Hash 運算後再存入資料庫,當作不可逆的辨識依據(像指紋)。下次使用者登入時,再用同一 Hash 演算法計算並比較以驗證身分。

小結

對於這邊有一個簡單的比較表格

  • 編碼(encoding)
  • 加解密
  • 雜湊(Hash)
資料是否可以還原運算後資料長度安全性
雜湊不可固定
編碼不一定
加解密不一定

加解密和編碼最常被誤會的地方,是以為使用 Base64 編碼就很安全(事實上只要知道你用的是編碼,就能還原成原始資料)。


參考文章 - [淺談] 編碼(encoding) vs 加解密 vs 雜湊(Hash) [1]