Пожалуйста, также рассмотрите "соление" вашего хэша (не кулинарное понятие!). По сути, это означает добавление произвольного текста к паролю перед его хэшированием.
" Значение соли помогает замедлить злоумышленника при атаке по словарю в случае взлома хранилища учетных данных, что дает вам дополнительное время для обнаружения и реагирования на компромисс. "
Для хранения хэшей паролей:
a) Генерирует случайное значение соли:
byte[] salt = new byte[32];
System.Security.Cryptography.RNGCryptoServiceProvider.Create().GetBytes(salt);
б) Добавьте соль к паролю.
// Convert the plain string pwd into bytes
byte[] plainTextBytes = System.Text UnicodeEncoding.Unicode.GetBytes(plainText);
// Append salt to pwd before hashing
byte[] combinedBytes = new byte[plainTextBytes.Length + salt.Length];
System.Buffer.BlockCopy(plainTextBytes, 0, combinedBytes, 0, plainTextBytes.Length);
System.Buffer.BlockCopy(salt, 0, combinedBytes, plainTextBytes.Length, salt.Length);
в) Хэш комбинированный пароль и соль:
// Create hash for the pwd+salt
System.Security.Cryptography.HashAlgorithm hashAlgo = new System.Security.Cryptography.SHA256Managed();
byte[] hash = hashAlgo.ComputeHash(combinedBytes);
d) Добавьте соль к полученному хешу.
// Append the salt to the hash
byte[] hashPlusSalt = new byte[hash.Length + salt.Length];
System.Buffer.BlockCopy(hash, 0, hashPlusSalt, 0, hash.Length);
System.Buffer.BlockCopy(salt, 0, hashPlusSalt, hash.Length, salt.Length);
e) Сохраните результат в базе данных вашего пользовательского хранилища.
Этот подход означает, что вам не нужно отдельно хранить соль, а затем заново вычислять хеш, используя значение соли и значение пароля в виде открытого текста, полученное от пользователя.
Редактировать : Поскольку необработанные вычислительные мощности становятся все дешевле и быстрее, ценность хеширования - или хелтинга - уменьшается. У Джеффа Этвуда превосходное обновление 2012 года , слишком длинное, чтобы повторить его полностью, в котором говорится:
Это (с использованием соленых хэшей) создаст иллюзию безопасности больше, чем любая реальная защита. Поскольку для генерации хеша требуется как соль, так и алгоритм выбора хеша, а также для проверки хеша, вряд ли у злоумышленника будет один, а другой нет. Если вы были скомпрометированы до такой степени, что злоумышленник имеет вашу базу паролей, разумно предположить, что они либо имеют, либо могут получить вашу секретную, скрытую соль.
Первое правило безопасности - всегда предполагать и планировать худшее.
Вы должны использовать соль, в идеале случайную соль для каждого пользователя? Конечно это
безусловно, хорошая практика, и, по крайней мере, это позволяет вам
устраните неоднозначность двух пользователей, имеющих одинаковый пароль. Но в эти дни
только соли больше не могут спасти вас от человека, готового потратить
несколько тысяч долларов на видеокарту, и если вы думаете, они
может, у тебя неприятности.