2014-02-06 98 views
2

我有一個遺留用戶數據庫,我想集成到一個新的Django項目中。簡單的MD5哈希可以轉換爲django密碼嗎?

密碼用簡單明瞭的MD5加密(MD5 PHP()函數)保存在舊數據庫的用戶,不用任何醃製。

重寫check_password和django.contrib.auth的set_password是不是一種選擇,因爲我已經有了新的Django項目活動的新用戶。

看着passlib,但不幸的是它不會做什麼是需要要在這一具體項目來完成。因此基本上,我唯一的選擇是將哈希以某種方式轉換爲Django salted格式,或實現自定義的check_password方法,該方法將確定密碼是純MD5還是django密碼(甚至可能通過我的參數自定義用戶模型,類似legacy=True布爾標誌)。

任何幫助,非常感謝。

+0

「將哈希以某種方式轉換爲Django醃製格式」 - 這應該是不可能的。第二個選項聽起來很對。 – amsh

+0

我知道,MD5被認爲是單向加密,但也許有人很好的彩虹表的知道:d –

+0

它實際上可以工作,只是我不太熱衷於做這樣的操作,以django.contrib.auth –

回答

7

Django的contrib.auth.hashers module已經支持純,無鹽MD5密碼:

# Ancient versions of Django created plain MD5 passwords and accepted 
# MD5 passwords with an empty salt. 
if ((len(encoded) == 32 and '$' not in encoded) or 
     (len(encoded) == 37 and encoded.startswith('md5$$'))): 
    algorithm = 'unsalted_md5' 

因此,如果您散列長度32(散列的十六進制表示) ,並且不包含$字符(這表明存在散列簽名前綴),哈希長37個字符,並與md5$$然後開始你的哈希值是已經支持

更好的是:任何成功進行身份驗證的用戶都會將其密碼哈希自動更新爲當前的首選方案。您的用戶將自己遷移您的數據庫。

+0

這是超級酷,在文檔中的任何參考? –

+0

我不這麼認爲;這是處理遺留設置的代碼,文檔沒有真正解決這個問題。請參閱https://code.djangoproject。com/ticket/18144的票證,可以讓您很好地瞭解Django支持的內容。 –

+0

劃痕;是的,當用戶成功登錄並且密碼使用過時格式散列時,密碼會升級到當前首選的散列方案。您的用戶將被自動遷移。 –

1

在這些情況下,我建議你採取不同的方法。

1)創建您自己的身份驗證後端。

2)在後端實現相同的密碼驗證系統,即您的PHP項目。

3)比較後端的哈希密碼,就像django身份驗證後端一樣。

4)認證成功後,設置Django的方法的用戶密碼,因此,它會使用默認的Django認證邏輯。 。

5)登錄用戶在