6 ответов:
EDIT: не используйте поставщика членства как есть, потому что он ужасно неадекватен с точки зрения защиты паролей пользователя
в свете того, что googling "алгоритм хэширования поставщика членства" появляется этот ответ в качестве первого результата, и Евангелие, которое будет выведено, мне следует предупредить людей об использовании такого поставщика членства и использовании хэшей, таких как SHA-1, MD5 и т. д., чтобы запутать пароли в база данных.
tl; dr
используйте функцию вывода ключей, такую как bcrypt, scrypt или (если вам нужно соответствие FIPS) PBKDF2 С фактором работы достаточным для того чтобы требовать времени хэширования для одиночного пароля быть как близко к 1000мс или больше.
хэши легко грубой силы в эти дни с многочисленными примерами нарушений данных в недавней истории. Чтобы предотвратить попадание паролей вашего пользователя на pastebin в следующем взломе, убедитесь, что пароли хэшируются с помощью функции, которая принимает достаточно долгое время для вычисления!
вместо поставщика членства, попробовать IdentityReboot или новые реализации от Microsoft, о которых говорит Трой Хант по крайней мере.
также интересно, что на тех же результатах 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; }
на выше ответ Райана Кристенсена не завершена. Часть, где он преобразует соль в байт [] не является правильным.
Это рабочий пример, который я реализовал в решение для клиента:
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); }
тип хэш-алгоритма по умолчанию-SHA1. Есть два способа изменить это.
1) Если вы работаете с IIS 7, Вы можете обновить его с помощью конфигурации "ключ машины" (показано ниже). Это позволяет выбрать метод шифрования из списка доступных параметров и указать ключи или параметры генерации ключей.
2) Если вы работаете с IIS 6, Вы можете изменить тип хэш-алгоритма, используя членство элемент в сети.конфигурационный файл:
<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 элемент в машине.конфигурационный файл. Вы можете использовать это, если вам требуется сторонний алгоритм хэширования. Машина.конфигурационный файл обычно можно найти в
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIGесли вы используете ASP.Net 2 или более поздней версии. Вы можете узнать больше о настройке этих значений здесь.
алгоритм хэширования по умолчанию изменен на HMACSHA256 в платформе .NET 4.0.
обратите внимание, что в отличие от SHA-1, HMAC SHA-256 является хэшем с ключом. Если ваши хэши ведут себя недетерминированно, вы, вероятно, не установили ключ, заставляя его использовать случайный. Что-то похожее на следующее Было бы виновником (что я только что потратил час на выяснение :p ).
HashAlgorithm.Create(Membership.HashAlgorithmType)Если вы хотите работать с существующим поставщиком, вы можете вернуть его обратно прежние значения по умолчанию с помощью данное руководство.
есть одно исправление в алгоритме хеширования вы должны использовать:
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
я прикрепляю фрагмент, показывающий код, как в ответе 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)Это рабочий код из активного приложения

Comments