Logo

新人日誌

首頁關於我部落格

新人日誌

Logo

網站會不定期發佈技術筆記、職場心得相關的內容,歡迎關注本站!

網站
首頁關於我部落格
部落格
分類系列文

© 新人日誌. All rights reserved. 2020-present.

Django 使用者密碼加密方式詳解

最後更新:2024年12月1日Python

本文為 Django 會員系統建立教學,第 2 篇:

  1. 設計登入與註冊功能的基礎路由與頁面配置
  2. Django 使用者密碼加密方式詳解 👈 所在位置
  3. 使用 Django 內建功能實現使用者註冊與登入
  4. 使用 Django 實現安全登出功能:完整指南
  5. Django 使用者登入與資料操作的最佳實踐
  6. Django: 添加公開留言與履歷列表功能
  7. 使用 Alpine.js 和 Django 動態管理留言按鈕啟用狀態
  8. 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 的加密方式,這種方式能有效地抵禦暴力破解和彩虹表攻擊。

加密過程的概念

  1. 一般加密方式:
    • 明文密碼:123
    • 加密後:xyz
  2. Master Key 加密方式:
    • 明文密碼:123
    • 加入 Master Key(隨機生成的秘鑰,例如 abc123xyz)
    • 最終加密結果:uvx89...

Master Key 的引入使得即使兩個使用者的密碼相同,加密後的值也會不同,增強了密碼的安全性。


為什麼常見加密方式(如 MD5)不可靠?

MD5 和其他簡單的哈希算法雖然能快速生成加密值,但已被證明容易被暴力破解或使用彩虹表(預先計算的哈希值查詢表)逆向還原。

示例

  1. 使用 MD5 加密:
    • 明文密碼:password123
    • MD5 哈希:482c811da5d5b4bc6d497ffa98491e38
  2. 攻擊方式:
    • 攻擊者通過現成的 MD5 彩虹表查詢即可還原 password123。

Django 的安全改進

Django 使用的密碼加密方式:

  • 引入 隨機鹽值,每次加密時生成不同的隨機數,防止相同密碼生成相同的哈希值。
  • 使用更安全的加密算法,如 PBKDF2 或 bcrypt,這些算法具有可配置的計算成本,增加破解的難度。

常見的問題與解答

問題 1:為什麼密碼必須加密?

加密可以保護使用者隱私,即使資料庫被攻擊者竊取,攻擊者也無法直接獲得明文密碼。

問題 2:如何判斷密碼是否安全儲存?

如果忘記密碼後,系統通過電子郵件直接發送明文密碼,說明密碼未加密儲存,這是一個嚴重的安全漏洞。

問題 3:Django 為什麼使用 Master Key?

Master Key 加密確保了即使兩個使用者的密碼相同,儲存的哈希值也不同,增強了系統的安全性。


總結

  • create_user() 和 authenticate() 是 Django 提供的核心方法,用於安全處理使用者密碼。
  • Django 採用的加密方式避免了常見的加密漏洞,能有效抵禦暴力破解和彩虹表攻擊。
  • 將 Master Key 與隨機鹽值結合的加密方式是 Django 安全性的基石。

透過上述機制,Django 能夠提供一個可靠且安全的使用者認證系統,適合各類型的應用開發。

目前還沒有留言,成為第一個留言的人吧!

發表留言

留言將在審核後顯示。

Python

目錄

  • 使用 create_user() 創建加密密碼的使用者
  • 範例代碼
  • 驗證密碼:authenticate
  • 範例代碼
  • Django 的密碼加密方式
  • 加密過程的概念
  • 為什麼常見加密方式(如 MD5)不可靠?
  • 示例
  • Django 的安全改進
  • 常見的問題與解答
  • 問題 1:為什麼密碼必須加密?
  • 問題 2:如何判斷密碼是否安全儲存?
  • 問題 3:Django 為什麼使用 Master Key?
  • 總結