Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

TL;DR

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

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

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

Также интересно, что по тем же результатам google, о которых говорилось выше, я нахожу учебник в котором люди очень ценят, насколько легко это сделать, чтобы переборщить эти пароли хэши, используя популярные инструменты, такие как JtR или Hashcat. На пользовательской платформе GPU 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

Ответ 2

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

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

Machine Key configuration page from IIS 7 administration tool

2) Если вы работаете с IIS 6, вы можете изменить тип хеш-алгоритма, используя элемент членства в файле web.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 или более поздней версии. Вы можете узнать больше об установке этих значений здесь.

Ответ 3

Алгоритм хэша по умолчанию изменен на HMACSHA256 в платформе .NET 4.0.

Обратите внимание, что в отличие от SHA-1, HMAC SHA-256 - это хеш-ключ. Если ваши хеши ведут себя недетерминированно, вы, вероятно, не задали ключ, заставляя его использовать случайный. Что-то вроде следующего было бы виновником (это то, что я только что потратил на час выяснения: p).

HashAlgorithm.Create(Membership.HashAlgorithmType)

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

Ответ 4

выше ответ Райана Кристенсена не является полным. Часть, в которой он преобразует соль в байт [], неверна.

Это рабочий пример, который я реализовал в решении для клиента:

public string EncodePassword(string pass, string salt)
    {
        byte[] bytes = Encoding.Unicode.GetBytes(pass);
        byte[] src = Convert.FromBase64String(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);
    }

Ответ 6

Я прикладываю фрагмент, показывающий код, как в Rawbert, отвечая выше в F #

open System
open System.Security.Cryptography
open System.Text

module PasswordHelper =
    let EncodePassword(pass : string, salt : string) =
        let bytes = Encoding.Unicode.GetBytes(pass)
        let src = Convert.FromBase64String(salt)
        let dst : byte array = Array.zeroCreate (src.Length + bytes.Length)
        Buffer.BlockCopy(src, 0, dst, 0, src.Length)
        Buffer.BlockCopy(bytes, 0, dst, src.Length, bytes.Length)
        let algorithm = HashAlgorithm.Create("SHA1")
        let inArray = algorithm.ComputeHash(dst)
        Convert.ToBase64String(inArray)

Это рабочий код из активного приложения