Nganku Junior Ответов: 2

Как правильно использовать соленые и хэшированные пароли


I'm having difficulties login in a page i've written using a salt-hashed password. Actually the code generates a 32-byte random salt taht it adds to the text inputed as password. then the hash of this is computed and stored in a table. However when one has to login, the text he inputs as password is salted with the same salt then hashed with the same hash function. if a match is detetcted then login is granted else, login is refused. I have difficulties implementing that.

Help please . my code below



Что я уже пробовал:

con.Open();
string salt = SaltF(32);
string Md = @"select Username, SH from SecureUser where Username= @usrn and SH= @sh";

SqlParameter usrname = new SqlParameter();
usrname.ParameterName = "@usrn";
usrname.Value = comboBox1.Text;
SqlParameter Sha = new SqlParameter();
Sha.ParameterName = "@sh";
Sha.Value = SaltHashF(salt, textBox2.Text);

SqlCommand cmdLd = new SqlCommand(Md, con);
cmdLd.Parameters.Add(usrname);
cmdLd.Parameters.Add(Sha);

SqlDataReader dr;
int K = 0;
dr = cmdLd.ExecuteReader();
while(dr.Read())
{
    K++;
}

if (K==1)
{
    con.Close();
    MessageBox.Show("Login Successful", " ", MessageBoxButtons.OK, MessageBoxIcon.Information);
    textBox2.Clear();
    ChangePasswordPlatform cpp = new ChangePasswordPlatform();
    cpp.Tag = this;
    cpp.Show(this);
    Hide();
}
else
{
    MessageBox.Show("Invalid username or password", " ", MessageBoxButtons.OK, MessageBoxIcon.Warning);
    textBox2.Clear();
}

private static string SaltF(int size) { using (RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider()) { byte[] bytes = new byte[size]; rng.GetBytes(bytes); return Convert.ToBase64String(bytes); } } private static string SaltHashF(string salt, string pwd) { string PwdAndSalt = string.Concat(salt, pwd); string PwdSaltHash = Hash256F(PwdAndSalt); return PwdSaltHash; } 

2 Ответов

Рейтинг:
15

F-ES Sitecore

Вы должны использовать одну и ту же соль с каждым пользователем. Итак, создайте соль для пользователя 1, скажем, "salt1". Затем добавить, что их пароль и хэш его потом хранить соль и хэш результата; хеш(соль + дуо) (допустим это ABCDEFG)

UserID, Username, Salt, Hash
1, user1, salt1, ABCDEFG



Когда этот пользователь входит в систему, вы считываете его соль из базы данных и добавляете ее к паролю, который он указал в поле пароля, и хэшируете его, чтобы увидеть, соответствует ли он сохраненному хэшу.

GenerateHash(dr["Salt"] + textBox2.Text)



То, что делает ваш код, генерирует новую соль каждый раз, так что если вы солите пароль пользователя 1 с помощью "salt1", когда они создают свою учетную запись, а затем, когда они входят в систему, солите его с помощью salt2, то результирующие хэши не будут совпадать.

hash ("salt1" + "password") < & gt; hash ("salt2" + " password")

Если вы загуглите, есть статьи, которые покажут вам, как все это сделать.