Хеширование паролей с солью. Правильно ли я делаю это в среде ASP.NET?

Я разрабатываю веб-сайт с помощью ASP.NET. Я хочу реализовать аутентификацию при входе для своих пользователей. Я использую метод SALT HASH для безопасного сохранения паролей пользователей в БД. Посмотрев на различные коды, я написал код, как показано ниже, для генерации паролей SALT и Hashed для хранения в базе данных.

    private string hashedPassword;
    private string Salt;
    private string SaltPlusPassword;
    private const byte saltSize = 24;
    byte[] saltArray;
    byte[] hashedPasswordArray;
    byte[] bytes;

   public void Save_Login(string passWord)
    {
        using (RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider())
        {
            saltArray = new byte[saltSize];
            rng.GetBytes(saltArray);
        }
        Salt = Convert.ToBase64String(saltArray);
        SaltPlusPassword = String.Format("{0}{1}", Salt, passWord);
        using (SHA256 sha = SHA256.Create())
        {
            bytes = Encoding.UTF8.GetBytes(SaltPlusPassword);
            hashedPasswordArray = sha.ComputeHash(bytes);
        }


        hashedPassword = Convert.ToBase64String(hashedPasswordArray);
    }

// Соль будет сохранена в БД

// hashedPassword будет сохранен в БД.

Так что у меня мало вопросов.

1) Я прочитал в статье, что фраза «сделай свою соль по крайней мере такой же, как и результат хэш-функции» - это нормально. Каковы размеры массивов saltArray, hashedPasswordArray и bytes, объявленных в моем коде? Я использовал размер saltArray как 24. Это нормально?

2) Что будет, если я воспользуюсь?

bytes = Encoding.Unicode.GetBytes (SaltPlusPassword);

вместо того

байты = Encoding.UTF8.GetBytes (SaltPlusPassword);

3) Какой тип данных я должен использовать для хранения соли и хешированного пароля в БД? (Моя база данных - это MYSQL)

4) Есть ли разница в производительности, если я использую SHA256Managed вместо SHA256? Что лучше?

5) Наконец, правильно ли я это делаю? Какие недостатки в приведенном выше коде? Ваши предложения?


person Prageeth Liyanage    schedule 18.11.2014    source источник
comment
вы собираетесь использовать статический солевой код?   -  person Arijit Mukherjee    schedule 18.11.2014
comment
Никакого ариджита. Это не статический солевой код. Он генерируется случайным образом с помощью RNGCryptoServiceProvider.   -  person Prageeth Liyanage    schedule 18.11.2014
comment
тогда почему вы храните его в базе данных?   -  person Arijit Mukherjee    schedule 19.11.2014
comment
Ариджит, я думаю, тебе стоит узнать больше о хешировании паролей с солью. :). Вот вам ссылка. crackstation.net/hashing-security.htm Соль должна генерироваться случайным образом, и вы должны сохранить оба соль и хэш в записи базы данных пользователя.   -  person Prageeth Liyanage    schedule 19.11.2014
comment
Я никогда не сохраняю пароль для соли, что я обычно делаю в этом случае, - это хранить хешированный пароль в базе данных, получить пароль, сгенерировать соль в моем приложении, добавить пароль и соль, когда пользователь попытается войти в систему, хеш-пароль и соль с помощью jquery и отправят эти данные к моему приложению, поэтому пароль для путешествий всегда разный   -  person Arijit Mukherjee    schedule 20.11.2014


Ответы (1)


Вместо того, чтобы заниматься всеми этими проблемами, почему бы не использовать встроенные инструменты управления идентификацией, предоставляемые ASP.NET. Посмотреть здесь

http://www.asp.net/identity/overview/getting-started/introduction-to-aspnet-identity

Намного более распространенный и надежный.

person sonofaforester    schedule 18.11.2014
comment
Как это связано с защитой паролей пользователей? : O - person Prageeth Liyanage; 18.11.2014
comment
Потому что он защитит пароли пользователей за вас. Это фактический способ сделать это. - person sonofaforester; 18.11.2014