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

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

Ответы на вопрос(6)

показывающий код, как в ответе Руберта выше в 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)

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

mework.

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

HashAlgorithm.Create(Membership.HashAlgorithmType)

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

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

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

public string Hash(string value, string salt)
    {
        byte[] bytes = Encoding.Unicode.GetBytes(value);
        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);
    }
 01 окт. 2013 г., 11:13
К счастью, только чтение соли отличается от реализации Райана. Это означает, что если у вас есть набор паролей + солей, сгенерированных ошибочной реализацией, и вы хотите начать использовать стандартный поставщик членства (или, по крайней мере, правильную реализацию, приведенную здесь), вам просто нужно исправить все существующие соли в вашей базе данных:var fixedSalt = Convert.ToBase64String(Encoding.Unicode.GetBytes(oldSalt);
 06 авг. 2015 г., 11:50
Этот работал для меня. Благодарю.

ть это.

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

Machine Key configuration page from IIS 7 administration tool

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

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

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

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

 26 дек. 2012 г., 11:37
Это лучший ответ
 10 нояб. 2010 г., 14:56
@Joel ASP.Net расширяемый, поэтому вы можете подобрать эту реализацию (derekslager.com/blog/posts/2007/10/…) и выставить его как пользовательский HashAlgorithm или путем создания пользовательского поставщика, как описано в другом ответе.
 08 нояб. 2010 г., 05:29
К сожалению, Bcrypt не находится нигде в этих списках.

которую вы должны использовать:

byte[] src = Convert.FromBase64String(salt);

вместо

byte[] src = Encoding.Unicode.GetBytes(salt);

Читать статьюhttp://svakodnevnica.com.ba/index.php?option=com_kunena&func=view&catid=4&id=4&Itemid=5&lang=en#6

Решение Вопроса
EDIT: Do not use the Membership Provider as-is because it is horridly inadequate in terms of protecting user's passwords

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

tl;dr

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

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

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

Также интересно, что на тех же самых результатах Google, упомянутых выше, я нахожуучебник, показывающий людям, как просто взломать эти хэши паролей, используя популярные инструменты, такие как JtR или Hashcat. На настраиваемой графической платформе SHA1 можно взломать наошеломляющий показатель 48867million hashes per second! С бесплатным словарем, как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

 27 окт. 2010 г., 15:05
Я думаю, что отсутствует часть кода в примере.
 06 апр. 2016 г., 05:48
Я серьезно отношусь к вопросу "SHA-1 довольно хороша сейчас" в контексте популярных методов грубой силы и скорости, с которой хэши SHA-1 (и их мутации) могут быть взломаны, и что это - принятый ответ, так много людей собираются доверять ему.
 16 апр. 2013 г., 20:51
Функция EncodePassword здесь не работает. Смотрите рабочий пример из & quot; Rawbert & quot; ниже.
 02 мар. 2017 г., 01:46
@faester Извиняюсь, я должен был сказать, что это версия 3 идентификатора aspnet, так что, возможно, он менее полезен ...github.com/aspnet/Identity/blob/dev/src/…
 09 апр. 2016 г., 23:49
Вероятно, проще сказать, что это было решением в 2009 году, когда на вопрос был дан ответ, а не многословным ответом, поскольку большинство разработчиков, я надеюсь, знают это в настоящее время. Я полагаю, что большинство хороших разработчиков проверят даты решений и, вероятно, используют их, только если работают на какой-то устаревшей системе, которая до сих пор недостаточно хешируется. В 2009 году SHA-1 был «довольно хорошим на данный момент», то есть «на данный момент»; прошел.

Ваш ответ на вопрос