Хотя мьютекс & amp; Семафоры используются в качестве примитивов синхронизации, между ними существует большая разница. В случае мьютекса, только поток, который заблокировал или получил мьютекс, может разблокировать его. В случае семафора поток, ожидающий семафора, может сигнализироваться другим потоком. Некоторые операционные системы поддерживают использование mutex & amp; семафоры между процессом. Обычно использование создается в общей памяти.
В свете того факта, что поиск в Google "алгоритм хеширования поставщика членства " представляет этот ответ как первый результат и евангелие, которое будет выведено, мне надлежит предупредить людей об использовании такого поставщика членства и об использовании хешей, таких как SHA-1, MD5 и т. Д., Для сокрытия паролей в базах данных.
Используйте функцию получения ключа, такую как 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;
}
Тип алгоритма хеширования по умолчанию - SHA1. Есть два способа изменить это:
1) Если вы работаете с IIS 7, вы можете обновить его, используя конфигурацию «Machine Key» (показанную ниже). Это позволяет вам выбрать метод шифрования из списка доступных опций и указать ключи или опции генерации ключей.
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 или новее. Подробнее об установке этих значений можно прочитать здесь .