dyooshi Ответов: 1

Как сравнить зашифрованный пароль в базе данных с вновь введенным паролем при входе в систему VB.NET-что?


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

Вот код для кнопки входа в систему

Private Sub SubmitButton4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SubmitButton4.Click
        'Check if username or password is empty
        If PasswordTextBox1.Text = "" Or UsernameTextBox2.Text = "" Then
            MessageBox.Show("Please fill-up all fields!", "Authentication Error", MessageBoxButtons.OK, MessageBoxIcon.Error)

            'Clear all fields
            PasswordTextBox1.Text = ""
            UsernameTextBox2.Text = ""

            'Focus on Username field
            UsernameTextBox2.Focus()

        Else
            'Connect to DB
            Dim conn As New System.Data.OleDb.OleDbConnection()
            conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + "C:\Users\user1\Documents\Visual Studio 2010\Projects\Crypto\Crypto\crypto.accdb"

            Try
                'Open Database Connection
                conn.Open()

                Dim sql As String = "SELECT Password FROM registration WHERE Username='" & Encrypt(UsernameTextBox2.Text) & "'"

                Dim cmd As OleDbCommand = New OleDbCommand(sql, conn)
                Dim sqlRead As OleDbDataReader = cmd.ExecuteReader()
                Dim password As String = cmd.ExecuteScalar().ToString().Replace("", "")

                If (password = Encrypt(PasswordTextBox1.Text)) Then

                    PasswordTextBox1.Clear()
                    UsernameTextBox2.Clear()

                    'Focus on Username field
                    UsernameTextBox2.Focus()
                    Me.Hide()
                    Mainpage.Show()
                Else
                    LoginAttempts = LoginAttempts + 1
                    If LoginAttempts >= 3 Then
                        End
                    Else
                        ' If user enter wrong username or password
                        MessageBox.Show("Sorry, wrong username or password", "Authentication Failure", MessageBoxButtons.OK, MessageBoxIcon.Error)

                        'Clear all fields
                        PasswordTextBox1.Text = ""
                        UsernameTextBox2.Text = ""

                        'Focus on Username field
                        UsernameTextBox2.Focus()
                    End If
                End If
            Catch ex As Exception
                MessageBox.Show("Failed to connect to Database", "Database Connection Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
                'Clear all fields
                PasswordTextBox1.Text = ""
                UsernameTextBox2.Text = ""
            End Try
        End If

    End Sub


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

Я уже нашел решение https://stackoverflow.com/questions/29032706/c-sharp-encrypted-login и попробуйте следовать коду, но все равно у него есть ошибка.

Richard Deeming

"Шифрование" подразумевает, что вы можете восстановить исходный текст. Как таковой, он не принадлежит нигде рядом с системой аутентификации.

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

Безопасная Аутентификация Паролем Объясняется Просто[^]
Соленое хэширование паролей - делаем это правильно[^]

1 Ответов

Рейтинг:
2

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;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

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

Вы можете посмотреть здесь: Хранение паролей: как это сделать.[^] - код написан на C#, но он довольно очевиден, и это может преобразовать его, если вы действительно не можете понять: Преобразователь кода C# в VB и VB в C# – Telerik[^]

И помните: если это веб-сайт и у вас есть какие-либо пользователи из Европейского союза, то применяется GDPR, а это означает, что вы должны обрабатывать пароли как конфиденциальные данные и хранить их безопасным и безопасным способом. Текст-это ни то, ни другое, и штрафы могут быть ... ГМ ... выдающийся. В декабре 2018 года немецкая компания получила относительно низкий штраф в размере 20 000 евро именно за это.


dyooshi

Ладно, я это изменю. Это глупая ошибка. Спасибо, что указал. Кстати, теперь это веб-сайт. Это всего лишь простое приложение для windows. Итак, как я могу сравнить зашифрованный пароль с паролем, который был зашифрован во время входа в систему?

OriginalGriff

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