Python hashlib 與 base64 雜湊與編碼

在處理敏感資訊、驗證檔案完整性或進行 API 通訊時,資料的安全性與格式轉換至關重要。Python 內建的 hashlib 用於處理「單向不可逆」的雜湊,而 base64 則用於處理「可逆」的二進位轉文字編碼。

hashlib 模組:資料雜湊 (Hashing)

雜湊函數能將任意長度的資料轉換為固定長度的指紋(Hash 值)。

常用雜湊算法

import hashlib

text = "hello world"
# 注意:hashlib 處理的是 bytes,所以字串需要 encode()
text_bytes = text.encode('utf-8')

# SHA-256 (目前主流推薦)
sha256_hash = hashlib.sha256(text_bytes).hexdigest()
print(f"SHA-256: {sha256_hash}")

# MD5 (不建議用於安全性,僅適合簡單的檔案校驗)
md5_hash = hashlib.md5(text_bytes).hexdigest()
print(f"MD5: {md5_hash}")

實務應用:加鹽 (Salting)

密碼絕對不能以明文儲存。為了防止彩虹表攻擊,通常會加入一段隨機字串(鹽巴)。

import hashlib

def hash_password(password, salt="secret_random_salt"):
    combined = password + salt
    return hashlib.sha256(combined.encode()).hexdigest()

print(hash_password("123456"))

base64 模組:二進位編碼

Base64 是一種將二進位數據轉換為 64 個可列印字元的編碼方式,常用於發送 Email 附件、在 JSON 中嵌入圖片或 URL 參數傳送。

編碼與解碼

import base64

original_text = "Python 是最強的!"
# 先轉 bytes,再 base64 編碼
encoded_bytes = base64.b64encode(original_text.encode('utf-8'))
print(f"編碼後: {encoded_bytes}") # b'UHl0aG9uIOaYryZ... (bytes)'

# 將 bytes 轉回字串
encoded_str = encoded_bytes.decode('utf-8')
print(f"Base64 字串: {encoded_str}")

# 解碼回原始內容
decoded_bytes = base64.b64decode(encoded_str)
print(f"還原內容: {decoded_bytes.decode('utf-8')}")

URL 安全編碼

標準的 Base64 包含 +/,這在 URL 中有特殊意義。urlsafe_b64encode-_ 代替它們。

import base64

data = b'\xfb\xef' # 這些 bytes 在標準 Base64 會產生特殊字符
print(base64.b64encode(data))         # b'++8='
print(base64.urlsafe_b64encode(data)) # b'--8=' (URL 安全)

總結

  • hashlib:不可逆。用於密碼儲存、檔案指紋檢查與資料完整性驗證。
  • base64:可逆。用於在僅支援純文字的環境中傳輸二進位檔案或非 ASCII 字元。
雖然 hashlib 提供多種算法,但請避免在涉及安全性的功能中使用 md5sha1,因為它們已經被證明容易受到碰撞攻擊。推薦使用 sha256 或更高等級。