ASP.NET成员资格使用的默认哈希算法是什么?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (22)

什么是ASP.NET成员资格使用的默认散列算法?我该如何改变它?

提问于
用户回答回答于

不要按原样使用成员资格提供程序,因为它在保护用户密码方面可怕的不足

鉴于使用谷歌搜索“会员提供商哈希算法”作为第一个结果以及推断出的福音的事实,我有必要警告人们使用这样的会员供应商并使用像SHA-1之类的哈希值,MD5等混淆数据库中的密码。

使用像bcrypt,scrypt或(如果需要符合FIPS)的密钥派生函数,PBKDF2的工作因子足以使单个密码的哈希时间接近1000ms或更长。

近期历史上存在大量数据泄露的例子,哈希现在很容易暴力破解。为了防止用户的密码在下一次破解中结束于pastebin,请确保使用需要足够长时间计算的函数对密码进行哈希处理

除了会员提供商之外,还可以尝试使用IdentityRebootTroy Hunt至少谈到的来自微软新实现

同样有趣的是,在上面提到的同样的谷歌结果中,我发现了一个教程,向人们展示了使用JtR或Hashcat等流行工具蛮横强制这些密码哈希值的方法。在定制的GPU平台上,SHA1可以以每秒 48867 万次哈希惊人速度破解有了像rockyou之类的免费词典,一个有数据库动机的人会很快拥有大部分用户密码。作为一名开发人员,必须履行保护用户密码安全所必需的道德责任。

默认的散列是SHA1,但他们也会将它和salt64绑定在一起:

public string EncodePassword(string pass, string salt)
{
    byte[] bytes = Encoding.Unicode.GetBytes(pass);
    byte[] src = Encoding.Unicode.GetBytes(salt);
    byte[] dst = new byte[src.Length + bytes.Length];
    Buffer.BlockCopy(src, 0, dst, 0, src.Length);
    Buffer.BlockCopy(bytes, 0, dst, src.Length, bytes.Length);
    HashAlgorithm algorithm = HashAlgorithm.Create("SHA1");
    byte[] inArray = algorithm.ComputeHash(dst);
    return Convert.ToBase64String(inArray);
}

如果你想知道更多关于如何改变它,我仍然需要找出(除非使用自定义提供程序见下文),但SHA-1现在是非常好的。如果你正在寻找扭转或从这个查找这些人做了一些工作:http : //forums.asp.net/p/1336657/2899172.aspx

如果正在制作自定义提供程序,则可以创建散列和加密算法和方法。

private byte[] ConvertPasswordForStorage(string Password)
      {
         System.Text.UnicodeEncoding ue = 
      new System.Text.UnicodeEncoding();
         byte[] uePassword = ue.GetBytes(Password);
         byte[] RetVal = null;
         switch (_PasswordFormat)
         {
            case MembershipPasswordFormat.Clear:
               RetVal = uePassword;
               break;
            case MembershipPasswordFormat.Hashed:

               HMACSHA1 SHA1KeyedHasher = new HMACSHA1();
               SHA1KeyedHasher.Key = _ValidationKey;
               RetVal = SHA1KeyedHasher.ComputeHash(uePassword);
               break;
            case MembershipPasswordFormat.Encrypted:
               TripleDESCryptoServiceProvider tripleDes = new 
       TripleDESCryptoServiceProvider();
               tripleDes.Key = _DecryptionKey;
               tripleDes.IV = new byte[8];
               MemoryStream mStreamEnc = new MemoryStream();
               CryptoStream cryptoStream = new CryptoStream(mStreamEnc, 
        tripleDes.CreateEncryptor(), 
      CryptoStreamMode.Write);

               cryptoStream.Write(uePassword, 0, uePassword.Length);
               cryptoStream.FlushFinalBlock();
               RetVal = mStreamEnc.ToArray();
               cryptoStream.Close();
               break;

         }
         return RetVal;
      }

private string GetHumanReadablePassword(byte[] StoredPassword)
      {
         System.Text.UnicodeEncoding ue = new System.Text.UnicodeEncoding();
         string RetVal = null;
         switch (_PasswordFormat)
         {
            case MembershipPasswordFormat.Clear:
               RetVal = ue.GetString(StoredPassword);
               break;
            case MembershipPasswordFormat.Hashed:
               throw new ApplicationException(
        "Password cannot be recovered from a hashed format");

            case MembershipPasswordFormat.Encrypted:
               TripleDESCryptoServiceProvider tripleDes = 
        new TripleDESCryptoServiceProvider();
               tripleDes.Key = _DecryptionKey;
               tripleDes.IV = new byte[8];
               CryptoStream cryptoStream = 
        new CryptoStream(new MemoryStream(StoredPassword), 
      tripleDes.CreateDecryptor(), CryptoStreamMode.Read);
               MemoryStream msPasswordDec = new MemoryStream();
               int BytesRead = 0;
               byte[] Buffer = new byte[32];
               while ((BytesRead = cryptoStream.Read(Buffer, 0, 32)) > 0)
               {
                  msPasswordDec.Write(Buffer, 0, BytesRead);

               }
               cryptoStream.Close();

               RetVal = ue.GetString(msPasswordDec.ToArray());
               msPasswordDec.Close();
               break;
         }
         return RetVal;
      }

http://msdn.microsoft.com/en-us/library/aa479048.aspx

用户回答回答于

默认的哈希算法类型是SHA1。有两种方法可以改变这一点。

1)如果使用IIS 7,则可以使用“机器密钥”配置(如下所示)更新它。这可以从可用选项列表中选择加密方法,并指定密钥或密钥生成选项。

2)如果使用的是IIS 6,则可以使用web.config文件中的membership元素更改散列算法类型:

<membership
    defaultProvider="provider name"
    userIsOnlineTimeWindow="number of minutes"
    hashAlgorithmType="SHA1">
    <providers>...</providers>
</membership>

根据文档,hashAlgorithmType属性的字符串值可以是任何提供的.Net散列算法类型。挖掘的比特表明,对于ASP.Net 2,3和3.5的有效值是MD5RIPEMD160SHA1SHA256SHA384SHA512。这里的重要部分是所有这些类继承自HashAlgorithm

hashAlgorithmType属性的值也可以是machine.config文件中cryptoNameMapping元素的条目。如果你需要第三方哈希算法,你可以使用它。C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG如果使用ASP.Net 2或更高版本,通常可以找到machine.config文件。你可以阅读更多关于在这里设置这些值。

扫码关注云+社区