2011-08-09 58 views
0

我正在使用Jquery SHA512.js發送加密併發送用戶名和密碼到服務器。 在服務器上,我正在執行以下操作來創建我的DB存儲的HASH:SHA加密 - 是否真的需要鹽?

$ dbhash = = hash('sha256',(hash('sha512',$ user).hash('sha256',$ extremesalt )));

這一切工作正常。

我的問題是鹽的價值是什麼? 在Salt應用於密碼的時候,密碼已經在服務器上,而不是在Internet上傳輸。 Salt也存儲在密碼哈希旁邊。

因此它似乎有人需要得到我的哈希的表,如果他們這麼做,他們也可以得到鹽和我的代碼的休息和做他們想要與我在一般的網站是什麼。

我可以看到其良好的應用鹽和我會做,但它僅發生在服務器上,而不是從瀏覽器向服務器我懷疑它的價值。我錯過了什麼嗎?

另外一個問題 - 是它可以從瀏覽器向服務器申請鹽。我假設沒有,或者至少如果你這樣做了,如果有人檢查了源代碼(例如:在我的原因在jquery中可見),將是可見的。因此沒有真正的價值。

THX

回答

4

鹽的要點是使其更難,看看2人的密碼是相同的。關於SHA的一件事是它不容易逆轉。大多數攻擊都涉及爲常見密碼生成散列,因此對於相當複雜的密碼來說,它變得更難,特別是鹽(有些人使用用戶名作爲鹽,其他人使用隨機生成的數字)。通常你想在服務器端代碼上做到這一點(我不認爲在瀏覽器代碼上安全)。你也不應該將實際的密碼存儲在你只存儲散列的服務器上(如果你還不知道它,也許是鹽)

再次看一看,我看到你在使用2個散列之後其他256和512.這是一個壞主意,使用一個並堅持下去。您浪費時間計算多個哈希值。

+0

我+1你的答案爲第一段。第二段可能在未來是錯誤的。看到我的評論馬克B. –

+0

@馬克,是的,我真的讀了幾個星期後,這個文件相當有趣。儘管有散列哈希的技術,但它具有這種效果,可以更容易地找到原始字符串。我有另一篇文章顯示這個地方,但我現在似乎無法找到它。 –

2

這樣的混合哈希值是毫無意義。採用sha512散列並通過sha256運行它必然會將密鑰空間減半,所以你所做的只是浪費了cpu時間,使碰撞機率加倍。這個可能性仍然是微不足道的,但仍然需要考慮。

的鹽是有作爲對接覆蓋機制。如果由於某種原因你的數據庫泄露了(例如轉儲文件被「丟失」),那麼生成一個sha256/512常見密碼彩虹表並查看桌面上是否有任何點擊將是微不足道的。散列在那裏使生成彩虹表的花費更加昂貴。例如「密碼」很容易散列和檢查。 「密碼#^ $ @#%#^ Y#@#$ @#^%$^Y %% $」不太可能被彩虹遮擋。

+0

使用鹽也可以保護您從哈希中恢復常用密碼......例如[谷歌搜索「hello」的md5哈希值(http://www.google.co.uk/search?sourceid=chrome&ie = UTF-8&q = 5d41402abc4b2a76b9719d911017c592) –

+0

@Chris:這是由於彩虹表。 md5本身沒有被破壞,因爲你可以從一個散列中檢索原始字符串,但現在計算/編排衝突以找到一個散列爲相同值的字符串現在相當簡單。鹽不能防止碰撞,特別是精心策劃的。 –

+0

@MarcB - 由於SHA-2的消息擴展功能,通過SHA-2(256)運行SHA-2(512)輸出可能會增強對通過線性近似計算碰撞的阻力 - 請參閱Sanadhya和Sarkar以獲取參考信息和信息。就所執行的操作而言,SHA-256的複雜性與SHA-512類似 - 例如,小西格瑪-1函數具有3次旋轉和XORd移位。 SHA-512沒有例如6次旋轉和2次移位,它只是因爲SHA-512寄存器較大而具有較大的旋轉。 –

0

我不知道你的應用程序,但你不希望只發送用戶名/密碼來使用SSL服務器和SSL讓的公共密鑰加密照顧加密爲您服務。然後,服務器可以生成一個適當的哈希來存儲散列的密碼,或者與以前存儲的哈希進行比較以進行驗證。

0
$dbhash = = hash('sha256',(hash('sha512',$user) . hash('sha256',$extremesalt))); 

應該是(無需雙散列)

$dbhash = = hash('sha512',$pass + $salt); 

凡通是密碼和鹽是一些關於用戶唯一的(用戶ID爲例)。如果您選擇隨機值,則需要使用散列來存儲它。