Member 12611488 Ответов: 2

Проьлем в encraption пароль


Когда я использую
string EncraptedPassword = FormsAuthentication.HashPasswordForStoringInConfigFile(txtPassword.Text, "SHA1");

затем мой пароль шифруется и сохраняется в базе данных sql, но проблема в том, что пароль, сохраненный в таблице базы данных sql server, не является полной длиной(означает, что когда я использую всплывающую подсказку в asp.net в это время длина заключенного пароля больше, но не он сохраняет только половину длины пароля в таблице базы данных)

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

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

string uname = txtUsername.Text;
string pass = FormsAuthentication.HashPasswordForStoringInConfigFile(txtPassword.Text.Trim(), "SHA1");
            con.Open();
            string qry = "select * from tblUser where Email='" + uname + "' and Pasword='" + pass + "'";
            SqlCommand cmd = new SqlCommand(qry, con);
            SqlDataReader sdr = cmd.ExecuteReader();
            if (sdr.Read())
            {
                Response.Redirect("~/Home.aspx");
            }
            else
            {
                lblMeg.Visible = true;
            }

2 Ответов

Рейтинг:
18

OriginalGriff

Не делай этого так. Никогда не объединяйте строки для построения SQL-команды. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого используйте параметризованные запросы.

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку с точки зрения SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x'; DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?

Это особенно важно в системах входа в систему, потому что они позволяют мне сделать это без входа в систему или полностью обойти вашу процедуру входа в систему, введя свое имя пользователя как
admin';--
А это значит, что пароль мне не нужен.
Кроме того, вы храните пароль в виде строки, что является расточительным и ненужным.
Храните его в виде столбца VARBINARY, отправляйте хэшированное значение напрямую, а когда вы хотите проверить, вы используете userID для извлечения хэшированных байтов с помощью параметризованного запроса. Затем ваш код C# сравнивает хэши и решает, авторизован ли пользователь.


Рейтинг:
0

Dave Kreskowiak

Во-первых, это "шифрование", а не "захват". Ну, если только вы не заключаете пароли в буквальное "дерьмо".

Хэширование пароля или что-то еще не шифрует его. В вашем случае вы используете криптографический хэш, математическое представление исходного объекта, которое не может быть отменено. Вы не можете расшифровать хэш, чтобы получить исходное значение обратно.

Хеширование не означает, что вы получите то же количество байтов, что и исходный объект. Велика вероятность, что вы получите другое количество байтов, чем исходный объект.

С помощью "encyption" вы можете получить исходный объект обратно. НЕ ИСПОЛЬЗУЙТЕ ОБЫЧНЫЙ ТЕКСТ ИЛИ ШИФРОВАНИЕ ДЛЯ ХРАНЕНИЯ ПАРОЛЕЙ!! Всегда используйте криптографический хэш и храните хэшированное значение.


Member 12611488

Не могли бы вы предоставить мне решение, чтобы я мог это сделать, потому что я новичок в программировании word
заранее спасибо

Dave Kreskowiak

Это задокументировано повсюду. Возьмите свой выбор настоящий Устав[^].