2014-05-02 29 views
14

在瓶,瓶 - generate_password_hash不是恆定的輸出

當我嘗試運行每次generate_password_hash("Same password")多次 的輸出中有什麼不同?

我在做什麼錯。爲什麼它不是恆定的?

我猜它的設置鹽有點關係嗎?

+1

原來,當我將它存儲在我的數據庫中時,我正在截斷它即因此,我無法正確地比較它:-) –

+1

感謝您提出這個問題 - 我正在重新調整,以便進行比較而不是使用check_password_hash()方法。除此之外,我們不知道如何解決這個問題。 Upvote爲你們兩個。 – JakeJ

回答

29

密碼是鹽漬,是的。在散列之前將salt添加到密碼中,以確保散列在rainbow table attack中不可用。

因爲每次調用函數時都會隨機生成salt,所生成的密碼哈希值也是不同的。返回的散列包含生成的鹽,以便仍可以正確驗證密碼。

演示:

>>> from werkzeug.security import generate_password_hash 
>>> generate_password_hash('foobar') 
'pbkdf2:sha1:1000$tYqN0VeL$2ee2568465fa30c1e6680196f8bb9eb0d2ca072d' 
>>> generate_password_hash('foobar') 
'pbkdf2:sha1:1000$XHj5nlLU$bb9a81bc54e7d6e11d9ab212cd143e768ea6225d' 

這兩個字符串不同;但包含足夠的信息,以驗證密碼,因爲所產生的鹽被包括在每個:

# pbkdf2:sha1:1000$tYqN0VeL$2ee2568465fa30c1e6680196f8bb9eb0d2ca072d 
    ^^^^^^^^^^^^^^^^ salt ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
     algo info ^^^^^^^^  actual hash of the password 
    (PBKDF2 applied SHA1 1000 times) 

由於隨機鹽是tYqN0VeL一個和XHj5nlLU,所得到的散列也不同。

foobar密碼仍然可以對任一哈希驗證:

>>> from werkzeug.security import check_password_hash 
>>> check_password_hash('pbkdf2:sha1:1000$tYqN0VeL$2ee2568465fa30c1e6680196f8bb9eb0d2ca072d', 'foobar') 
True 
>>> check_password_hash('pbkdf2:sha1:1000$XHj5nlLU$bb9a81bc54e7d6e11d9ab212cd143e768ea6225d', 'foobar') 
True 

另見