我的下一个任务是加密密码。我正在数据库访问层工作,我的同事提出了这个请求:在空方法上实现SHA-512哈希。我怎么能这样做?
答案 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。几点说明:
答案 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)
该页面的C#示例:
byte[] data = new byte[DATA_SIZE];
byte[] result;
SHA512 shaM = new SHA512Managed();
result = shaM.ComputeHash(data);