.NET中是否有内置的密码哈希函数?

6

我看到了这个问题Encrypting/Hashing plain text passwords in database

我知道我不应该使用md5("salt" + password); 我在python中看到了一个实现解决方案的例子。

是否有一个.NET内置函数可以使用参数,而不是编写自己的函数?

4个回答

2

我不认为有一个单一的函数可以实现这个功能,但你可以用几行代码来完成(这里使用SHA512,但还有其他选项):

using (var sha = new SHA512CryptoServiceProvider())
{
    byte[] hashed = sha.ComputeHash(Encoding.Default.GetBytes(saltedPassword));
    string output = Convert.ToBase64String(hashed);
}

请确保使用Crypto...类之一,以确保使用更安全的算法。


4
计划很糟糕。没有盐的哈希容易受到彩虹表攻击。你使用了加密类是好的,但必须包括一些盐才能使这个答案有用。此外,最后一行应该使用Convert.ToBase64String,它与BitConverter.ToString一样快,并且生成的字符串要短得多(在这种情况下为88字节而不是192字节)。如果纠正这两个问题,这可能会成为最佳答案,我认为。 - Ray Burns
感谢您的澄清。是的,显然在哈希之前应该对密码进行加盐,这也是我在这里打算做的,但我看到了混淆的来源。我会更新以更明确地说明。还要感谢您提到Base64String转换。 - John Bowen
请勿使用任何哈希函数的单次加密,无论该函数有多好。请使用已知对密码哈希处理效果良好的方法 - SCrypt、BCrypt 或 PBKDF2(例如 .NET 的 RFC2898DeriveBytes)。虽然 SHA-512 是一种很好的加密哈希函数,但由于 2014 年的 GPU 上 64 位操作性能较差,即使在单个 PC 上使用 8x AMD R9 290X 标准核心时钟的 oclHashcat 仍然可以每秒尝试 7.97 亿次猜测,或每月 2E15 次猜测。 - Anti-weakpasswords

2
是的,.NET Framework 2.0及以上版本(截至目前包括4.5)在一个名为Rfc2898DeriveBytes的类中实现了PBKDF2(也称为RFC2898和PKCS#5v2)。从技术上讲,它实现了PBKDF2-HMAC-SHA-1,虽然不如PBKDF2-HMAC-SHA-512好,但对于密码哈希仍然是合理的。
PBKDF2参数:
  • HMAC不是这个类的参数 - HMAC-SHA-1在此实现中已经固定,因此您不必担心它。
  • 密码是用户的密码。
    • 明文在哈希后当然会被丢弃。
  • 盐是一个加密随机的每行字符串,长度足够长(例如至少8个字节)。每个密码都需要自己的随机盐,因此如果300个用户都选择“P@$$w0rd”作为他们的密码,则哈希结果都是不同的。
    • 盐以明文形式存储在数据库中;下次生成密码哈希时需要它,以查看结果是否相同。
  • 迭代次数是您要循环的次数。对于任何桌面或服务器硬件,从几万开始,一直增加到感觉吃力为止。
    • 迭代次数也应以明文形式存储在数据库中,以便稍后轻松更改此数字(即随着处理能力的增加而使其更高)。
  • .GetBytes是输出长度,以字节为单位。在这种情况下,您应该使用20。
    • 原因(高级讨论):对于密码哈希,这永远不应该超过本地哈希大小,因为攻击者不需要生成更多(并且生成本地哈希大小+1字节需要双倍时间,因为它从每个本地哈希大小的输出长度开始一个全新的迭代集合,将结果连接在一起 - 攻击者可以安全地假设如果第一个输出匹配,则所有输出都匹配,如果第一个块失败,则100%确定它不匹配)。由于此类仅限于SHA-1,因此本机哈希大小为20字节。如果您使用另一个具有此选项的库,则SHA-256为32字节,SHA-512为64字节。
请注意 HMACSHA512与Rfc2898DeriveBytes用于密码哈希 包含了一些我没有详细分析的 .NET 代码,但可能是一个有用的起点。

有没有关于它比FormsAuthentication.HashPasswordForStoringInConfigFile更好或更差的评论? - Kuba hasn't forgotten Monica
1
RFC2898要更好,即使使用1次愚蠢的迭代计数也是如此 - 并且在成千上万次的合理迭代计数下更好!它们从Microsoft自己的[注:此API现已过时](http://msdn.microsoft.com/en-us/library/system.web.security.formsauthentication.hashpasswordforstoringinconfigfile(v = vs.110).aspx)开始,然后继续进行“这只是(几乎肯定)未加盐的MD5或SHA-1!不要那样做!!!”基于Drop in replacement for FormsAuthentication.HashPasswordForStoringInConfigFile? - Anti-weakpasswords

1

1
此 API 已经过时。 - Kuba hasn't forgotten Monica

1

不应该使用MD5进行密码哈希!!!

不好!!!也不应该在单个哈希传递(md5或其他)上执行盐+密码!!!不好!!!

也不应该多次进行盐+密码哈希(除非像PBKDF2一样对每个哈希传递进行XOR!!!不好!!!

使用此API:https://sourceforge.net/projects/pwdtknet 好!!!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接