是否有内置函数来在.NET中散列密码?

时间:2010-01-23 03:07:44

标签: .net security hash passwords

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

我知道我不应该做md5(“盐”+密码);我在python中看到了一个解决方案的实现。

是否有一个.NET内置函数与params我可以使用而不是自己编写?

4 个答案:

答案 0 :(得分:2)

我认为没有一个功能,但您可以在几行中完成(这里使用SHA512,但还有其他选项):

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

确保使用其中一个Crypto ...类,以确保使用更安全的算法。

答案 1 :(得分:1)

查看FormsAuthentication.HashPasswordForStoringInConfigFile

string hashMD5 = FormsAuthentication.HashPasswordForStoringInConfigFile(Pass + Salt, "MD5");

string hashSHA1 = FormsAuthentication.HashPasswordForStoringInConfigFile(Pass + Salt, "SHA1");

答案 2 :(得分:1)

不,你不应该使用MD5进行密码散列!!!!!

坏!!!!!你也不应该通过一个哈希传递(md5或其他)来执行salt +密码!坏!!!!

你也不应该多次使用盐+密码哈希(根据PBKDF2,每个散列传递都是异常的!不好!!!!

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

答案 3 :(得分:1)

是的,.NET Framework 2.0及更高版本(到目前为止包括4.5)在名为Rfc2898DeriveBytes的类中实现了PBKDF2(也称为RFC2898和PKCS#5v2)。从技术上讲,它实现了PBKDF2-HMAC-SHA-1,虽然不如PBKDF2-HMAC-SHA-512,但仍然可以用于密码散列。

PBKDF2论点:

  • HMAC不是此类的参数 - HMAC-SHA-1在此实现中已修复,因此您无需担心。
  • 密码是用户的密码。
    • 当然,在散列后丢弃明文。
  • Salt是一个足够长度的加密随机每行字符串(例如,至少8个字节)。每个密码都需要自己的随机盐,所以如果300个用户都选择“P @ $$ w0rd”作为密码,则散列结果都是不同的。
    • 盐以明文形式存储在数据库中;你需要在下次生成密码哈希时查看结果是否相同。
  • 迭代次数是您要循环的次数。对于任何桌面或服务器硬件,从数万起,然后上升直到它受到伤害。
    • 迭代次数也应以明文形式存储在数据库中,以便稍后更改此数字(即随着处理能力的提高而使其更高)是微不足道的。
  • .GetBytes是输出长度,你猜对了,字节。在这种情况下,您应该使用20。
    • 原因(高级讨论):对于密码散列,这绝不会超过本机散列大小,因为攻击者不需要生成更多(并且生成本机散列大小+ 1个字节需要两倍的时间,因为它为输出长度中的每个本机散列大小量启动一组全新的迭代,将结果连接在一起 - 攻击者可以安全地假设如果第一个输出匹配,它将全部匹配,并且100%确定如果第一个块失败,它不匹配)。由于此类仅限于SHA-1,因此本机散列大小为20个字节。如果您使用另一个具有该选项的库,则SHA-256为32字节,SHA-512为64字节。

请注意HMACSHA512 versus Rfc2898DeriveBytes for password hash包含一些示例.NET代码,我没有详细分析,但这可能是一个有用的起点。