2017-02-21 47 views
1

這是我的理解,哈希函數將始終返回相同的結果時,饋送相同的數據。但我一直在使用libsodium(通過節點鈉),這不是發生了什麼。我對密碼散列有什麼誤解?

我有這個在我的架構:

​​

我得到記錄與該代碼三種不同的字符串。例如

$argon2i$v=19$m=32768,t=4,p=1$ayPVQ1X+xNhWmD9S5AUuaw$1mWusk59AebhzOHhl+j5JpvmRI27Pq57XG5zcAB5R4U 
$argon2i$v=19$m=32768,t=4,p=1$PjTYKpfhh1bZh+MV84Y9kA$9+U33nf6efuugsrz15cEKDa5+rAHgYVA5Kqo4F1G3DE 
$argon2i$v=19$m=32768,t=4,p=1$Ii8AErmAFc0na9Yi2OgCkw$ySU80Fv9OiOmeT9EV/BWon1Jjck2Lx23nOeCk0wkMPU 

現在每個那些第一部分是一樣的,讓我的事情提交的密碼部分是相同的(因爲它是被散列緩衝區的第一部分)。所以也許是我不明白的緩衝區。

但是如果buf保持不變,爲什麼saltedPassBuff的其餘部分會發生變化?

編輯:還沒有寫完的時候,我不小心提交,編輯寫完問題

回答

1

除了你的鹽pwhash函數(文檔是最小的)最有可能還添加了它自己的隨機鹽,它也包含在結果中供以後比較使用crypto_pwhash_str_verify

還有一個「CPU密集型」方面,可能是一個迭代。僅僅使用哈希函數和鹽並沒有提高安全性。需要添加CPU密集型組件,如迭代。

重點是讓攻擊者花費大量的時間通過暴力破解密碼。

+0

事實證明是這樣的。這也將我的.pre()函數中的代碼量減半。我想我不打算進入libsodium如何跟蹤添加鹽。 –

0

正如其名稱所暗指,輸出醃製。這意味着在散列之前將一個隨機字符串添加到密碼中,並單獨包含在輸出值中。

這樣做的目的是擊敗dictionary attacks。通過在散列之前爲每個密碼添加一個隨機字符串,可以確保相同的密碼散列不同,從而迫使攻擊者分別破解每個密碼。

+0

我不認爲這答案是我問的。我通過'randombytes_buf()'函數添加了隨機數據,但是會發生一次,並且散列函數每次運行時都會散列相同的一組數據。除非你說'crypto_pwhash_str()'在運行實際哈希之前還要添加隨機字節。是這樣嗎?如果是這樣,你如何認證? –

+0

@Nick Johnson鹽也保險公司,兩個密碼不散列相同的值,從而泄漏兩個用戶有相同的密碼。 – zaph

+0

@TheE是的,'crypto_pwhash_str'根據[文檔](https://download.libsodium.org/doc/password_hashing/the_argon2i_function.html)添加一個salt。你不需要添加你自己的;它的目的是作爲一個完整的密碼哈希解決方案。 –