這是我已經有一個過得去的答案的一個問題 - 所以我在這裏發帖,看是否有人能夠改善它。生成在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算法,至少在用戶登錄一次之前。
任何人都可以改進此解決方案嗎?
這是一個好主意,雖然它不符合我的要求,一切都可以通過一組sql語句完成。 還是謝謝! – 2014-10-22 11:48:33
我並不知道你的環境,也沒有限制的原因,但是,必須調用mysql才能運行sql遷移腳本......可能是一個運行類似於上述遷移後代碼的Python腳本。 – mhawke 2014-10-22 11:56:39
沒有限制,我只是不想向django項目添加代碼並處理部署等。現在遷移過程是純sql,因此易於獨立於開發團隊運行。我將從我最喜歡的MySQL GUI(SQlyog)中運行它。 你的解決方案仍然是一個很好的解決方案,它只是不適合我想要做的事情。但我可能仍然會執行它! – 2014-10-22 14:28:58