Я разрабатываю веб-сайт с помощью 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) Наконец, правильно ли я это делаю? Какие недостатки в приведенном выше коде? Ваши предложения?