2015-03-22 3 views
1

В моем приложении функция SQL HASHBYTES возвращает разные значения для одной и той же строки. Ниже приведен код моего пользователя.SQL HASHBYTES возвращает другое значение

Guid fillerG = Guid.NewGuid(); 
using (SqlCommand com = new SqlCommand("INSERT INTO App_Users (UserName, PasswordHash, PasswordSalt) VALUES ('" + userNameTxt.Text + "', HASHBYTES ('SHA1', CONVERT(NVARCHAR(100), '" + userPassword.Text +   fillerG.ToString() + "')), '" + fillerG.ToString() + "'; ", con)) 
{ 
    com.ExecuteNonQuery(); 
} 

Когда я сравниваю приведенный выше вставленный ряд на моей странице входа, он не соответствует. Это мой скрипт сравнения.

SqlCommand loginCom = new SqlCommand("select COUNT(UserID) FROM App_Users WHERE UserName = '" + Login1.UserName + "' AND PasswordHash = HASHBYTES('SHA1', '" + Login1.Password + "' + CONVERT(NVARCHAR(36), PasswordSalt))", loginCon); 

Первый код хранит passwordHash как это:

0xDAC9280F85B40C06314228876717E342432807DB 

Но в окне запроса, функция HASHBYTES с теми же возвращает значение этого:

0xA561FBD35713F922AD761594658C193F12B82791 

UPDATE: Проверьте это изображение. Хэш пароля, хранящийся в коде, отличается от пароля, сгенерированного запросом (пароль Я дал это «ее»)

Query Output

+0

hashbytes является детерминированной функцией , Если вы загружаете тот же вход с использованием той же функции хэширования, вы получите тот же результат. Единственный вывод состоит в том, что две строки НЕ являются фактически равными. Я бы напечатал обе строки, проверил лидирующие/конечные, пробелы, невидимые символы и кодировку. – Xedni

ответ

5

Вы передаете два различных строки в HASHBYTES Вот почему вы получая различный результат.

В этом запросе:

using (SqlCommand com = new SqlCommand("INSERT INTO App_Users (UserName, PasswordHash, PasswordSalt) VALUES ('" + userNameTxt.Text + "', HASHBYTES ('SHA1', CONVERT(NVARCHAR(100), '" + userPassword.Text +   fillerG.ToString() + "')), '" + fillerG.ToString() + "'; ", con)) 
{ 
    com.ExecuteNonQuery(); 
} 

Вы используете userPassword.Text +fillerG.ToString() как строки Но

В этом запросе:

Login1.Password.Replace("'", "''") + "' + CONVERT(NVARCHAR(36), PasswordSalt))", loginCon); 

Вы заменяете цитаты

Login1.Password.Replace("'", "''") 

Try, как этот: используйте параметризованных запросов

SqlCommand cmd = new SqlCommand("INSERT INTO App_Users (UserName, PasswordHash, PasswordSalt) VALUES (@username, HASHBYTES ('SHA1', CONVERT(NVARCHAR(100),@pass')),@salt), con) 

    cmd.Parameter.AddWithValue("@username",userNameTxt.Text); 
    cmd.Parameter.AddWithValue("@pass",userPassword.Text); 
    cmd.Parameter.AddWithValue("@salt",fillerG.ToString()); 

И

SqlCommand cmd = new SqlCommand("select COUNT(UserID) FROM App_Users WHERE UserName = @username AND PasswordHash = HASHBYTES ('SHA1', CONVERT(NVARCHAR(100),@salt)))), con) 

cmd.Parameter.AddWithValue("@username",userNameTxt.Text); 
cmd.Parameter.AddWithValue("@salt",Login1.Password); 

Login1.Password и fillerG.ToString() должен быть таким же

+0

Нет ,,, это не проблема ,,, Я заменяю кавычки на оба кода ... Чтобы сделать это кратким в моем сообщении, я удалил их в первом коде. –

+1

см. Редактируемый ответ, @YesudassMoses –

+0

Я попытался добавить параметры, но все же ... :( Привет, Можете ли вы проверить обновление по моему вопросу, пожалуйста. –

Смежные вопросы