Как я могу легко добавить пароль из Textbox.Text?
Есть ли в .NET framework какие-то встроенные волшебства?
Как я могу легко добавить пароль из Textbox.Text?
Есть ли в .NET framework какие-то встроенные волшебства?
Некоторое время назад у нас была отличная дискуссия о лучших практиках при создании пароля, вы можете найти там несколько отличных идей:
Использование пароля: передовой опыт?
Я обнаружил, что один из самых простых, но при этом довольно безопасный - это использовать GUID в качестве соли. Он случайный и достаточно длинный. Лучше всего будет, если вы включите строковое форматирование GUID (символы '{' и '-'), но это не обязательно.
Помните, что соль должна быть уникальной для каждого соленого предмета, и для максимальной безопасности вы должны использовать криптографически безопасный генератор случайных чисел. Помните также, что вы должны хранить свою соль вместе с паролем, иначе вы не сможете сравнить версию открытого текста с хешированной версией! Вы можете хранить соль в незашифрованном виде, если хотите; Обычно я помещаю его в поле в той же таблице, что и пароль. Цель соли не в том, чтобы оставаться скрытой, а в том, чтобы сделать радужные таблицы трудными (надеюсь, невозможными) для своевременного вычисления.
Вот небольшой фрагмент, который будет работать на C #:
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
byte[] buffer = new byte[1024];
rng.GetBytes(buffer);
string salt = BitConverter.ToString(buffer);
var saltedPassword = password + salt;
or...
var salt = Guid.NewGuid().ToString();
var saltedPassword = password + salt;
Я полагаю, вы запрашиваете имя пользователя вместе с паролем?
В некоторых системах имя пользователя используется как соль. (И я думаю, что это нормально.) В противном случае вам нужно будет где-то хранить свою соль и извлекать ее перед хешированием (в случае случайно созданной соли) или иметь алгоритм, который будет возвращать ту же соль для того же user (и не лучше просто использовать простое имя пользователя).
Лично используйте следующий код:
byte[] GetSaltedPasswordHash(string username, string password)
{
byte[] pwdBytes = Encoding.UTF8.GetBytes(password);
// byte[] salt = BitConverter.GetBytes(userId);
byte[] salt = Encoding.UTF8.GetBytes(username);
byte[] saltedPassword = new byte[pwdBytes.Length + salt.Length];
Buffer.BlockCopy(pwdBytes, 0, saltedPassword, 0, pwdBytes.Length);
Buffer.BlockCopy(salt, 0, saltedPassword, pwdBytes.Length, salt.Length);
SHA1 sha = SHA1.Create();
return sha.ComputeHash(saltedPassword);
}
Вот хорошая статья и еще один (более адаптированный для приложений ASP.NET).
Здесь нет волшебства, соль - это просто какой-то случайный текст, добавленный к паролю, чтобы отразить атаки по словарю - придумайте свой собственный треп.
Взгляните на функции hmac, такие как hmacdm5, hmacsha1 или hmacsha256. Посмотрите также на пространство имен System.Security.Cryptography.