Member 13058758 Ответов: 4

Проверка хэшированного пароля на коде c#


Мне нужен запрос или код c# для сравнения хэшированного пароля и числового пароля на странице входа вручную

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

SqlCommand cmd = new SqlCommand("select aspnet_Users.id, aspnet_Membership.Password from aspnet_Users,aspnet_Membership where id= '" + TextBox1.Text + "'AND Password= '" + TextBox2.Text + "'", conn);

4 Ответов

Рейтинг:
17

Richard Deeming

Вы пользуетесь ASP.NET поставщик членства, так что вам не нужно проверять пароль самостоятельно; просто позвоните в службу поддержки. Членство.Методы validateuser[^] метод.

bool isPasswordCorrect = Membership.ValidateUser(TextBox1.Text, TextBox2.Text);
NB: Вы должны давать своим элементам управления осмысленные имена, а не просто принимать имена по умолчанию, назначенные дизайнером Visual Studio. Конечно, вы можете вспомнить, какое значение TextBox42 представляет сейчас но когда вы вернетесь к своему коду через несколько недель , вы этого не сделаете.


Рейтинг:
1

MadMyche

Как уже говорилось ранее, ваш код созрел для того, чтобы Уязвимость SQL-инъекции.
Никогда не стройте вместе и Sql-команду с пользовательским вводом, вы всегда должны использовать Parameters для добавления пользовательского контента в команду. Это также имеет то преимущество, что поставщик данных SQL будет автоматически устанавливать типы (INT, VARCHAR, DATE) на основе предоставляемого содержимого (если это не так НУЛЕВОЙ).

Способ, которым я бы написал код, состоял бы в том, чтобы следовать этому порядку операций:
1. SQL-команда для получения Пароль на основе имени пользователя.
2. Выполните скалярную команду - если нет возврата имя пользователя его не нашли.
3. Используйте все, что угодно Hash функция была применена к сохраненному паролю при возврате
4. сравните хэшированную версию попытки ввода пароля с тем, что было сохранено в БД

Это основная структура того, как это будет выглядеть. Вам нужно будет соответствующим образом настроить код для вашей структуры таблицы и функций
(Извините, у меня нет времени исследовать, что у вас есть в использовании, и эта клавиатура плохая, поэтому я опустил некоторые символы/скобки)

SqlCommand cmd = new SqlCommand("SELECT PasswordHash FROM AccountTable WHERE UserName = @UserName", conn);
cmd.Parameters.AddWithValue("UserName", TextBox1.Text);

conn.Open();
var SqlReturn = cmd.ExecuteScalar();

if (SqlReturn == null)
	// account not found
else
	string PasswordAttempt = HashFunctionName(TextBox2.Text); // whatever this function is called
	if (PasswordAttempt != SqlReturn.ToString() 
		// login failed
	else
		// Success


Рейтинг:
0

Patrice T

Цитата:
Мне нужен запрос или код c# для сравнения хэшированного пароля и числового пароля на странице входа вручную

Вам нужно применить ту же функцию хэширования, что и 1, примененная к существующим паролям.
Хэш - функция- Википедия[^]
SqlCommand cmd = new SqlCommand("select aspnet_Users.id, aspnet_Membership.Password from aspnet_Users,aspnet_Membership where id= '" + TextBox1.Text + "'AND Password= '" + TextBox2.Text + "'", conn);

Не решение вашего вопроса, а еще одна проблема, которая у вас есть.
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь к уязвимости под названием "SQL-инъекция", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа выйдет из строя. Если пользователь вводит имя, например "Брайан О'Коннер", может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция - Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL-инъекция - руководство пользователя[^]
Шпаргалка по предотвращению инъекций SQL - OWASP[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? - Обмен Стеками Информационной Безопасности[^]


Рейтинг:
0

Richard MacCutchan

Тут две вещи не так:
1. никогда не используйте конкатенацию строк для создания SQL-команд, так как это делает вашу базу данных уязвимой для SQL-инъекций. Используйте правильные параметризованные запросы.
2. Не передавайте открытый текстовый пароль в качестве одного из параметров запроса. Сначала вы должны создать хэш введенного текста и сравнить два хэш-значения.


Member 13058758

как я создаю хэш введенного текста?

Richard MacCutchan

Точно так же, как вы создали исходный хэш.

Member 13058758

Я делаю это в конфигурационном файле passwordFormat="Hashed"

Richard MacCutchan

Извините, я не понимаю; какой конфигурационный файл и какой пароль вы имеете в виду?

Member 13058758

<членство>
<провайдеры>
<очистить>
<add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionstringname="localsqlserver" enablepasswordretrieval="false" enablepasswordreset="true" requiresquestionandanswer="false" requiresuniqueemail="false" passwordformat="Hashed" minrequirednonalphanumericcharacters="0" minrequiredpasswordlength="3" Maxinvalidpasswordattempts="3" passwordattemptwindow="15">



это мой код в файле web.config, который я делаю для своих разрешенных ролей в веб-приложении
и я вставляю столбец identity и называю его id в базе данных теперь мне нужен c# sqlcommand для сравнения между хэшированным паролем и фактическим паролем, где этот идентификатор и пароль истинны

*Я заставляю форму входа вводить этот идентификатор и пароль вместо имени пользователя и пароля

Richard MacCutchan

Извините, у меня нет никакого опыта в этом деле. ASP.NET.

Member 13058758

спасибо за вашу помощь