如何哈希密码?

时间:2010-05-11 19:35:31

标签: c# security

我的下一个任务是加密密码。我正在数据库访问层工作,我的同事提出了这个请求:在空方法上实现SHA-512哈希。我怎么能这样做?

4 个答案:

答案 0 :(得分:10)

您应该使用bcrypt,这对于密码比SHA512更安全。

如果你真的需要使用SHA512,你应该使用SHA512Managed class,正如其他答案所提到的那样。
确保你的哈希盐。

答案 1 :(得分: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

答案 2 :(得分: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个赞成的答案,其中有些人无法理解盐是什么,以及技术流行语捍卫他的位置......然而他有所有这些赞成(太懒了找到问题,但这是史诗般的。)

答案 3 :(得分:1)

SHA512 Class

该页面的C#示例:

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