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 提供多種算法,但請避免在涉及安全性的功能中使用 md5 或 sha1,因為它們已經被證明容易受到碰撞攻擊。推薦使用 sha256 或更高等級。