2014-10-22 75 views
2

這是我已經有一個過得去的答案的一個問題 - 所以我在這裏發帖,看是否有人能夠改善它。生成在MySQL加密口令,來填充Django的數據庫

我從舊的定製系統遷移的客戶數據(MySQL數據庫與明文密碼!)在模塊中使用。數據遷移只能使用一組可以針對兩個數據庫運行的sql腳本(將數據從舊數據庫移動到新數據庫)。該流程需要可重複,可預測並且可能無人值守運行。

我需要採取現有密碼,加密,並將它們存儲在一個格式是可接受的Django(見詳情here)。理想情況下,我會使用django的首選PBKDF2 hasher來做到這一點,但這很難,因爲我無法輕鬆模擬PBKDF2所做的密碼延伸/多次迭代。

我現在的解決方法是鹽和使用SHA1加密明文密碼,並將它們存儲在Django。然後,客戶第一次登錄時,Django會自動將密碼加密升級到PBKDF2。

我想爲此使用SHA2/SHA256,但是Django在沒有PBKDF2的情況下不支持此功能,至少除非我編寫自己的密碼哈希後端並將其添加到django settings.py - 這似乎很多努力。

因此,我到了在我的移民sql腳本如下(簡化爲清楚起見):

insert into auth_user(username,password) 

SELECT username 
    , CONCAT(
    'sha1$', 
    @salt := SUBSTRING(MD5(RAND()) FROM 1 FOR 12), 
    '$', SHA1(CONCAT(@salt,password)) 
    ) AS password 
FROM 
    old_user_table; 

,其輸出密碼字符串是這樣的:

sha1$a6acb1163c50$e7225b82280d66b4d8125cb7817b7854e98a5657 

到目前爲止,它的工作原理對待 - 用戶可以登錄並且加密是靜默升級的。唯一的缺點是我們正在使用相對不安全的SHA1算法,至少在用戶登錄一次之前。

任何人都可以改進此解決方案嗎?

回答

1

你有明文密碼,所以你可以通過所有的用戶編寫一個簡單的腳本進行迭代,並驗證它們。在遷移sql腳本之後運行此操作,這會在您將其暴露給真實用戶之前升級每個用戶的密碼,從而減輕您對降低安全性的擔憂。

from django.contrib.auth import authenticate 

for username, password in get_usernames_and_passwords(): 
    if authenticate(username=username, password=password) is None: 
     print "Failed to authenticate user {!r}".format(username) 
+0

這是一個好主意,雖然它不符合我的要求,一切都可以通過一組sql語句完成。 還是謝謝! – 2014-10-22 11:48:33

+0

我並不知道你的環境,也沒有限制的原因,但是,必須調用mysql才能運行sql遷移腳本......可能是一個運行類似於上述遷移後代碼的Python腳本。 – mhawke 2014-10-22 11:56:39

+0

沒有限制,我只是不想向django項目添加代碼並處理部署等。現在遷移過程是純sql,因此易於獨立於開發團隊運行。我將從我最喜歡的MySQL GUI(SQlyog)中運行它。 你的解決方案仍然是一個很好的解決方案,它只是不適合我想要做的事情。但我可能仍然會執行它! – 2014-10-22 14:28:58