Django 使用者密碼加密方式詳解
更新日期: 2024 年 12 月 1 日
本文為 Django 會員系統建立教學,第 2 篇:
- 設計登入與註冊功能的基礎路由與頁面配置
- Django 使用者密碼加密方式詳解 👈 所在位置
- 使用 Django 內建功能實現使用者註冊與登入
- 使用 Django 實現安全登出功能:完整指南
- Django 使用者登入與資料操作的最佳實踐
- Django: 添加公開留言與履歷列表功能
- 使用 Alpine.js 和 Django 動態管理留言按鈕啟用狀態
- Django 收藏功能的實現:使用 ManyToMany 關係與自定義中介模型
建議閱讀本文前,先閱讀完 Django 與前端框架教學 系列文
在 Django 中,處理使用者密碼時,會採用一系列安全措施,以確保密碼在儲存和驗證過程中的安全性。
本文將解釋 Django 提供的密碼加密與驗證功能,以及加密方式的安全原理。
使用 create_user()
創建加密密碼的使用者
Django 提供了內建的 create_user()
方法,用於安全地創建使用者。
與直接儲存明文密碼不同,該方法會自動對密碼進行加密。
這意味著即使是網站管理員,也無法直接看到使用者的密碼。
範例代碼
from django.contrib.auth.models import User
# 創建新使用者並加密密碼
user = User.objects.create_user(username="john", password="secret")
在這裡,password="secret"
將經過加密處理後儲存到資料庫中,而非以明文形式存儲。
驗證密碼:authenticate
Django 提供了 authenticate()
方法,用於比對使用者輸入的密碼,和資料庫中加密的密碼。
該方法會將使用者輸入的密碼進行相同的加密處理,再與資料庫中的加密值比對。
範例代碼
from django.contrib.auth import authenticate
# 驗證使用者憑據
user = authenticate(username="john", password="secret")
if user:
print("驗證成功")
else:
print("驗證失敗")
Django 的密碼加密方式
Django 採用了基於 Master Key 的加密方式,這種方式能有效地抵禦暴力破解和彩虹表攻擊。
加密過程的概念
- 一般加密方式:
- 明文密碼:
123
- 加密後:
xyz
- 明文密碼:
- Master Key 加密方式:
- 明文密碼:
123
- 加入 Master Key(隨機生成的秘鑰,例如
abc123xyz
) - 最終加密結果:
uvx89...
- 明文密碼:
Master Key 的引入使得即使兩個使用者的密碼相同,加密後的值也會不同,增強了密碼的安全性。
為什麼常見加密方式(如 MD5)不可靠?
MD5 和其他簡單的哈希算法雖然能快速生成加密值,但已被證明容易被暴力破解或使用彩虹表(預先計算的哈希值查詢表)逆向還原。
示例
- 使用 MD5 加密:
- 明文密碼:
password123
- MD5 哈希:
482c811da5d5b4bc6d497ffa98491e38
- 明文密碼:
- 攻擊方式:
- 攻擊者通過現成的 MD5 彩虹表查詢即可還原
password123
。
- 攻擊者通過現成的 MD5 彩虹表查詢即可還原
Django 的安全改進
Django 使用的密碼加密方式:
- 引入 隨機鹽值,每次加密時生成不同的隨機數,防止相同密碼生成相同的哈希值。
- 使用更安全的加密算法,如 PBKDF2 或 bcrypt,這些算法具有可配置的計算成本,增加破解的難度。
常見的問題與解答
問題 1:為什麼密碼必須加密?
加密可以保護使用者隱私,即使資料庫被攻擊者竊取,攻擊者也無法直接獲得明文密碼。
問題 2:如何判斷密碼是否安全儲存?
如果忘記密碼後,系統通過電子郵件直接發送明文密碼,說明密碼未加密儲存,這是一個嚴重的安全漏洞。
問題 3:Django 為什麼使用 Master Key?
Master Key 加密確保了即使兩個使用者的密碼相同,儲存的哈希值也不同,增強了系統的安全性。
總結
create_user()
和authenticate()
是 Django 提供的核心方法,用於安全處理使用者密碼。- Django 採用的加密方式避免了常見的加密漏洞,能有效抵禦暴力破解和彩虹表攻擊。
- 將 Master Key 與隨機鹽值結合的加密方式是 Django 安全性的基石。
透過上述機制,Django 能夠提供一個可靠且安全的使用者認證系統,適合各類型的應用開發。