2017-01-23 26 views
1

我有一個NodeJS服務器,我需要從客戶端散列密碼。由於NodeJS應用程序沒有被編譯,我可以用一種語言編寫哈希進程,從中生成一個處理從我的NodeJS應用程序調用的進程的二進制文件,或者如果服務器受到攻擊,犯罪者能夠逆向工程處理哈希處理的二進制文件,就像從我的NodeJS應用程序的JS中讀取一樣簡單。使用NodeJS服務器散列文本的安全性

+1

密碼應該是*哈希*未加密,通過確保密碼實際上不存在於後端的任何位置,這大大降低了安全性問題。 –

+0

謝謝你的注意,亞歷克斯。這是我打算在我的問題中表達的過程。我已經更新了我的問題。 – nicktendo

+0

不要編寫自己的散列過程,使用SHA2或3實現。你用鹽和散列密碼,所以如果有人抓住你的數據庫,他們不能逆向工程的實際憑據。試圖隱藏算法不提供安全性 - 使用足夠強度的經過驗證的算法對密碼進行醃製和哈希處理是更安全的方法。 – dbugger

回答

1

散列 - 與加密相反 - 是一個單向過程。從純文本中獲取散列很容易,但除非您碰巧猜測散列文本是什麼,否則幾乎不可能做到相反。

因此,您不需要保持哈希算法的祕密。你不應該這樣做,因爲所有強者都是公開的,而且很難創造你自己的。

例如,SHA-256算法是公開的。但嘗試猜我剛纔散列到:

07123e1f482356c415f684407a3b8723e10b2cbbc0b8fcd6282c49d37c9c1abc 

你應該可以猜到它,如果你嘗試(請評論,如果你能猜出它!)因爲我的文字是有目的很簡單,我用了一個故意快速哈希函數 - 要想清楚,你需要保持幾件事情:

  1. 你的散列算法需要甚至強烈的算法強
  2. 您的密碼必須是難以猜測
  3. 你的哈希函數應該儘可能慢(這可能聽起來像是一個奇怪的軟件要求 - 參見下面的更多信息)

SHA-1或SHA-2速度很快,因此不足以使密碼安全,即使隨機鹽。但是,您可以使用散列算法以及任意複雜的計算(例如bcrypt)來使猜測速度較慢,但​​始終是可能的。

此外,使用隨機鹽,使彩虹表無法使用。

您希望使用慢速,CPU密集型算法儘可能慢地進行猜測,同時仍然可以正常運行。例如。除鹽之外,bcrypt(不使用SHA-1或SHA-2,而是Blowfish)具有一個成本參數,您可以使用該成本參數使得生成的函數儘可能成本高昂,從而使得猜測速度更慢它毫無意義。例如。如果你能夠持續100ms進行一次迭代,那麼等待真實用戶進行密碼驗證的時間並不長,但很快就會很快被攻擊者很快猜出密碼 - 每秒10次嘗試每秒少於100萬次。這是一個類似於您可以在一秒鐘內計算多少SHA-256哈希值的數字。

欲瞭解更多信息,請參閱:

感謝zaphLukePark以瞭解如何改進此答案的意見。

我仍然在等待任何人想我的散列消息來證明我的SHA-1是不夠的散列密碼的點。 提示:它很短。

+0

只使用散列函數是不夠的,只是添加一點鹽對提高安全性沒有多大作用。 – zaph

+0

關於PBKDF2/bcrypt的一段以及爲什麼單次迭代SHA2不足以大大改善此答案。 –

+0

SHA-256鹽不足的原因之一是筆記本電腦(我的)可以每秒執行750,000次,這將應用於按使用頻率排序的10,000,000個密碼的列表。然後有特殊的程序來模糊這些。除非是釣魚,否則攻擊者可能會對90%的密碼破解感到滿意。所以通過將計算機的時間從<2us to >延長100ms,攻擊者需要長達50,000次。這完全是爲了增加攻擊者的工作因素。 – zaph