14
在瓶,瓶 - generate_password_hash不是恆定的輸出
當我嘗試運行每次generate_password_hash("Same password")
多次 的輸出中有什麼不同?
我在做什麼錯。爲什麼它不是恆定的?
我猜它的設置鹽有點關係嗎?
在瓶,瓶 - generate_password_hash不是恆定的輸出
當我嘗試運行每次generate_password_hash("Same password")
多次 的輸出中有什麼不同?
我在做什麼錯。爲什麼它不是恆定的?
我猜它的設置鹽有點關係嗎?
密碼是鹽漬,是的。在散列之前將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
另見
原來,當我將它存儲在我的數據庫中時,我正在截斷它即因此,我無法正確地比較它:-) –
感謝您提出這個問題 - 我正在重新調整,以便進行比較而不是使用check_password_hash()方法。除此之外,我們不知道如何解決這個問題。 Upvote爲你們兩個。 – JakeJ