2010-05-11 105 views
7

我的下一個任務是加密密碼。我在數據庫訪問層工作,我的同事提出了這個請求:在空方法上實現一個SHA-512散列。我怎樣才能做到這一點?從該頁面如何散列密碼?

+16

不要。給安全專家留下密碼加密。你會弄錯它,然後你會危害你的組織。聘請專家;這比成功攻擊你不知道你加入到你的安全系統的弱點成功後的清理成本要便宜得多。 – 2010-05-11 19:44:50

+4

聘請專家取決於您的風險等級。如果你正在儲存大衆的私人信息,並且這個密碼是阻礙你的,那麼是找一個專家。下面列出的大多數例子都足以滿足您的平均非保密信息項目的需求。 – 2010-05-11 20:02:12

+1

@Eric - 我假設你的意思是「在.NET中使用SHA512的實現而不是創建你自己的」,而不是「使用.NET中實現的成員提供程序來提高安全性」。我可以看到兩者都有一定的合理性,但是當我同意前者時,我可以看到一些後者不可行的情況。事實上,我從來沒有想到有人會考慮實現他們自己的SHA-512版本 - 因此你的評論讓我感到困惑了一下,你是否應該將應用中的安全性委託給更合格的人。 :-) – tvanfosson 2010-05-11 20:07:24

回答

10

一個非常簡單的過程真正做到:

byte[] data = Encoding.UTF8.GetBytes(stringPasswordForExample); 

using(SHA512 sha512 = new SHA512Managed()) 
{ 
    byte[] hash = sha512.ComputeHash(data); // Add Per User Salt as per the Below 
} 

hash現在包含你想要散列初始數據的非可逆式哈希值。另外,請查看MSDN。有幾個注意事項:(時間越長越好,並且每個用戶獨特的 - 感謝保羅,好點)

  • 始終使用salt
  • SHA2 *發生器(和SHA一般)哈希方法是專爲速度,所以他們並不安全,但他們並不是最安全的。看看bcrypt以及SLaksmentioned
+0

downvote上的任何詞?謝謝。 – 2010-05-11 19:51:30

+2

+1,不過值得一提的是,salt應該是唯一的密碼。也許改變你的例子包括鹽 – PaulG 2010-05-11 19:54:03

+0

@保羅 - 好一點,添加它 – 2010-05-11 19:55:05

1

SHA512 Class

C#示例:

byte[] data = new byte[DATA_SIZE]; 
byte[] result; 
SHA512 shaM = new SHA512Managed(); 
result = shaM.ComputeHash(data); 
+0

-1用於使用快速的普通SHA-512。使用慢鍵推導函數,如PBKDF2,bcrypt或scrypt。 – CodesInChaos 2012-05-11 21:29:11

10

您應該使用bcrypt,這是比密碼SHA512更安全。

如果您確實需要使用SHA512,則應該使用SHA512Managed class,正如其他答案所述。
一定要鹽你的散列。

+2

有趣,在 – Pharabus 2010-05-11 19:39:54

+0

之前沒有看到過,在哈希之前不要給明文加鹽嗎? – 2010-05-11 21:27:05

+0

@uncle brad:這就是我的意思。 – SLaks 2010-05-11 21:31:35

7

如何散列密碼?

用鹽。真。

永遠,永遠此:

byte[] data = Encoding.UTF8.GetBytes(stringPasswordForExample); 

但這:

byte[] data = Encoding.UTF8.GetBytes(stringPasswordForExample + salt); 

這是一個最容易被誤解 「訣竅」。大多數人不知道什麼是「鹽」,當你向他們解釋時,他們認爲這毫無意義。

事實是:SHA-512或MD5或一些非常弱的散列,一旦彩虹表被預先計算,沒有任何區別。 SHA-65536,如果它存在(我在這裏很諷刺),一旦預先計算彩虹表,它將比任何其他哈希算法都好。

一個足夠大的「鹽」,使彩虹表是不可能的:

http://en.wikipedia.org/wiki/Rainbow_table

請注意,即使你完全明白哈希,鹽和彩虹表是如何關聯(因此明白爲什麼維基百科的文章指出:「鹽經常與哈希密碼一起使用,使這種攻擊更加困難,通常不可行。」)你的同事不可能有很高的可能性。就像很可能大多數人在這個主題中起伏,都不理解這個話題。

我在這裏看到了30個upvotes的答案,這裏有人不明白什麼是鹽,不斷用techno-buzzwords來保衛自己的位置......然而他擁有所有這些upvotes(太懶惰找到問題,但它是史詩)。

+1

你應該使用'RNGCryptoServiceProvider'以創建爲每個新的散列鹽,並同時存儲哈希和鹽。 – Will 2010-05-11 19:55:05

+0

僅靠鹽是不夠的。散列函數也應該很慢。使用PBKDF2,bcrypt或scrypt。 – CodesInChaos 2012-05-11 21:29:56