常有人會把「編碼 (Encoding)」、「加密 (Encryption)」以及「雜湊 (Hashing)」這三者混淆,甚至是誤用。

作為軟體開發者,應該對這些基本的資料處理技術有簡單的理解,否則開發出來的軟體很容易出現資安問題。

編碼 (Encoding)

編碼主要目的是轉換資料的格式,以便在不同的系統間傳輸或儲存。

編碼的過程是可逆的,且能以眾所皆知的方法編碼及解碼,也因此它不是用來保護資料的機密性。

常見的編碼方式:Base64、URL Encode

使用 Base64 編解碼範例

使用 base64 指令執行編碼

$ echo -n 'Puck' | base64
UHVjaw==

使用 base64 指令執行解碼

$ echo -n 'UHVjaw==' | base64 -d
Puck
  • -d:代表進行解碼的動作。

也可以直接從檔案讀取資料並輸出到檔案。

# 編碼
$ base64 -i plaintext.txt -o encoded.txt
$ cat encoded.txt
UHVjawo=

# 解碼
$ base64 -d -i encoded.txt -o plaintext.txt
$ cat plaintext.txt
Puck

加密 (Encryption)

加密的主要目的是用來保護資料的機密性,確保不會未經授權的人知道資料的內容。

加密的過程跟編碼一樣是可逆的,但它多加了金鑰的部分來限制只有知道金鑰的人才可以解密。

現今加密技術有分為「對稱加密」及「非對稱加密」兩種加密方式:

  • 「對稱加密」在加解密時是使用 同一組金鑰
  • 「非對稱加密」在加解密時是使用 不同的金鑰,分別稱為公鑰及私鑰。

常見的加密方式:

  • 對稱加密:AES、DES
  • 非對稱加密:RSA、ECS、DSA

常見應用:HTTPS、檔案加密

使用 AES 加解密範例

使用 openssl 指令執行加密

$ echo "Puck" | openssl enc -aes-128-cbc -a -salt -k KEY_STRING
U2FsdGVkX18b92lQm7P+t/xfRtNwEE2aeBOABJZTKgQ=
  • enc:表示使用 OpenSSL 加密的功能。
  • -aes-128-cbc:表示使用 AES 128 CBC 的加密方式。
  • -a:表示使用 Base64 格式輸出。
  • -salt:表示使用增加隨機值來增強安全性。
  • -k <password>:設定加密的金鑰字串。

使用 openssl 指令執行加密

$ echo "U2FsdGVkX18b92lQm7P+t/xfRtNwEE2aeBOABJZTKgQ=" | openssl enc -d -aes-128-cbc -a -salt -k KEY_STRING
Puck
  • enc:表示使用 OpenSSL 加密的功能。
  • -d:表示執行解密的操作。
  • -aes-128-cbc:表示使用 AES 128 CBC 的加密方式。
  • -a:表示使用 Base64 格式輸出。
  • -salt:表示使用增加隨機值來增強安全性。
  • -k <password>:設定加密的金鑰字串。

也可以直接從檔案讀取資料並輸出到檔案。

# 加密
$ openssl enc -aes-128-cbc -a -salt -k KEY_STRING -in plaintext.txt -out encrypted.txt
$ cat encrypted.txt
U2FsdGVkX1+eWPgBmQrtGPlfvFBB6C81xkdsS0UiA9w=

# 解密
$ openssl enc -d -aes-128-cbc -a -salt -k KEY_STRING -in encrypted.txt -out plaintext.txt
$ cat plaintext.txt
Puck
  • in:表示資料來源的檔案。
  • out:表示資料輸出的檔案。

雜湊 (Hashing)

雜湊主要目的在於產生資料的唯一識別碼。未來如果要比對原始資料就只需要比對這一組識別碼即可,如果識別碼相同代表原始資料相同。

雜湊過程是不可逆的,也就是使用正規手段沒辦法透過雜湊結果反推原始資料。

常見的雜湊方法:MD5、SHA 系列、HMAC、Blake2 常見應用:竄改檢查、資料庫密碼儲存

使用 AES 加解密範例

使用 openssl 指令執行雜湊

$ echo "Puck" | openssl dgst -sha256
a2ad93d2c9fd1ef000883ecb91e94b4d184e12143e751246a61227fa1fd74440
  • dgst:表示使用 OpenSSL 資料摘要的功能。
  • -sha256:表示使用 SHA256 雜湊演算法。

也可以計算整個檔案的雜湊值。

$ openssl dgst -sha256 plaintext.txt
SHA256(plaintext.txt)= a2ad93d2c9fd1ef000883ecb91e94b4d184e12143e751246a61227fa1fd74440

三種技術的比較

比較項目 編碼 (Encoding) 加密 (Encryption) 雜湊 (Hashing)
可逆性 O O X
安全性
執行花費時間
輸出資料大小
應用範圍 不同系統間傳輸 防止未經授權的存取 不需原始資料的資料比對

感謝閱讀!

喜歡這篇文章或是有幫助到你嗎? 歡迎分享給你的朋友!

有任何問題、回饋或您認為我會感興趣的任何東西嗎? 請在下面發表評論,或者是直接聯絡我


Puck Wang

Puck Wang

Hi! 我是 Puck Wang,這個部落格的作者,是一位全端網站開發者,常使用 .Net 和 React 進行開發,專注於架構研究,你可以在這個部落格看到我精選的筆記內容,希望對你會有所幫助。

更多關於我的訊息,可至關於關於頁面。