Что такое хеш-алгоритм по умолчанию, который использует членство ASP.NET?

Хотя мьютекс & amp; Семафоры используются в качестве примитивов синхронизации, между ними существует большая разница. В случае мьютекса, только поток, который заблокировал или получил мьютекс, может разблокировать его. В случае семафора поток, ожидающий семафора, может сигнализироваться другим потоком. Некоторые операционные системы поддерживают использование mutex & amp; семафоры между процессом. Обычно использование создается в общей памяти.

54
задан Peter Mortensen 8 March 2011 в 10:33
поделиться

2 ответа

РЕДАКТИРОВАТЬ: Не используйте поставщика членства как есть, потому что он ужасно неадекватен с точки зрения защиты паролей пользователей

В свете того факта, что поиск в Google "алгоритм хеширования поставщика членства " представляет этот ответ как первый результат и евангелие, которое будет выведено, мне надлежит предупредить людей об использовании такого поставщика членства и об использовании хешей, таких как SHA-1, MD5 и т. Д., Для сокрытия паролей в базах данных.

tl; dr

Используйте функцию получения ключа, такую ​​как bcrypt, scrypt или (если вам нужно соответствие FIPS) PBKDF2 с коэффициентом работы, достаточным для того, чтобы время хеширования для одного пароля было как можно ближе к 1000 мс и более.

В наши дни хэши легко подобрать перебором, и в недавней истории есть множество примеров утечки данных. Чтобы предотвратить ваш пользователь s паролей от попадания в pastebin при следующем взломе, убедитесь, что пароли хешируются с помощью функции, вычисление которой занимает достаточно много времени!

Вместо поставщика членства попробуйте IdentityReboot или новые реализации от Microsoft, о которых Трой Хант говорит как минимум .

Также интересно, что в тех же результатах Google, упомянутых выше, я нашел учебное пособие, показывающее людям, насколько это просто для перебора хэшей паролей с помощью популярных инструментов, таких как JtR или Hashcat. На настраиваемом графическом процессоре SHA1 может быть взломан с ошеломляющей скоростью 48867 миллионов хэшей в секунду ! С помощью бесплатного словаря, такого как rockyou или аналогичный мотивированный человек с вашей базой данных очень быстро получит большинство паролей ваших пользователей. Как разработчик, вы с этической точки зрения обязаны делать все необходимое для защиты безопасности паролей пользователей.


По умолчанию используется хеширование SHA1, но они также используют его в виде соли и base64:

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

Этот вопрос SO поможет в обращении или дублирование этой техники, если это может понадобиться. Повторная реализация ASP. Членство в .NET и хеширование пароля пользователя в Ruby

Если вы создаете собственный поставщик, вы можете создавать свои алгоритмы и методы хеширования и шифрования.

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

47
ответ дан 7 November 2019 в 07:47
поделиться

Тип алгоритма хеширования по умолчанию - SHA1. Есть два способа изменить это:

1) Если вы работаете с IIS 7, вы можете обновить его, используя конфигурацию «Machine Key» (показанную ниже). Это позволяет вам выбрать метод шифрования из списка доступных опций и указать ключи или опции генерации ключей.

Machine Key configuration page from IIS 7 administration tool

2) Если вы работаете с IIS 6, вы можете изменить тип алгоритма хеширования, используя элемент членства в сети Файл .config:

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

Согласно документации строковое значение атрибута hashAlgorithmType может быть любым из предоставленных типов алгоритмов хеширования .Net. Немного покопавшись, можно увидеть, что допустимые значения для ASP.Net 2, 3 и 3.5: MD5 , RIPEMD160 , SHA1 , SHA256 , SHA384 , SHA512 . Важной частью здесь является то, что все эти классы наследуются от HashAlgorithm .

Значение атрибута hashAlgorithmType также может быть записью из элемента cryptoNameMapping в файл machine.config. Вы можете использовать это, если вам нужен сторонний алгоритм хеширования. Файл machine.config обычно находится в C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ CONFIG , если вы используете ASP.Net 2 или новее. Подробнее об установке этих значений можно прочитать здесь .

Значение атрибута hashAlgorithmType также может быть записью из элемента cryptoNameMapping в файле machine.config. Вы можете использовать это, если вам нужен сторонний алгоритм хеширования. Файл machine.config обычно находится в C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ CONFIG , если вы используете ASP.Net 2 или новее. Подробнее об установке этих значений можно прочитать здесь .

Значение атрибута hashAlgorithmType также может быть записью из элемента cryptoNameMapping в файле machine.config. Вы можете использовать это, если вам нужен сторонний алгоритм хеширования. Файл machine.config обычно находится в C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ CONFIG , если вы используете ASP.Net 2 или новее. Подробнее об установке этих значений можно прочитать здесь .

27
ответ дан 7 November 2019 в 07:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: