我的下一个任务是加密密码。我正在数据库访问层工作,我的同事提出了这个要求:在一个空的方法中实现SHA-512哈希。我该如何做到呢?
我的下一个任务是加密密码。我正在数据库访问层工作,我的同事提出了这个要求:在一个空的方法中实现SHA-512哈希。我该如何做到呢?
其实这是一个非常简单的过程:
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。一些注意事项:
在处理密码时,应该使用bcrypt,它比SHA512更安全。
如果您确实需要使用SHA512,则应使用SHA512Managed
类,正如其他答案提到的那样。
请确保盐值加入哈希中。
如何对密码进行哈希处理?
使用盐值。真的。
千万不要做这个:
byte[] data = Encoding.UTF8.GetBytes(stringPasswordForExample);
byte[] data = Encoding.UTF8.GetBytes(stringPasswordForExample + salt);
http://en.wikipedia.org/wiki/Rainbow_table
请注意,即使您完全理解哈希、盐和彩虹表之间的关系(因此理解维基百科文章中所述:“通常使用盐与哈希密码一起使用,以使此攻击更加困难,通常是不可行的。”),但您的同事很有可能不理解。就像在这个主题上投赞成票或反对票的大多数人不理解这个主题一样,这是非常可能的。RNGCryptoServiceProvider
为每个新的哈希创建盐,并存储哈希和盐。 - user1228该页面中的C#示例:
byte[] data = new byte[DATA_SIZE];
byte[] result;
SHA512 shaM = new SHA512Managed();
result = shaM.ComputeHash(data);