Как солить и хэшировать пароль - PullRequest
1 голос
/ 18 декабря 2011

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

Dim frm As New MarksEntryFrm
    Dim flag As Boolean
    flag = False
    If cboForm.Text = "" Or cboAcadYear.Text = "" Or cboSubjCode.Text = "" Or txtUserName.Text = "" Or txtPassword.Text = "" Then
        MessageBox.Show("Please any of the fields cannot be left blank", "Blank fields", MessageBoxButtons.OK, MessageBoxIcon.Error)
    Else
        cmd = New SqlCommand("Select a.Form,a.AcademicYear,b.SubjectID,b.UserID,b.Password,c.Term from StudentDetails.Programmes a, StudentDetails.Subjects b,RegistrationDetails.Registration c where b.SubjectID='" & cboSubjCode.SelectedItem & "' and b.UserID='" & txtUserName.Text & "' and b.Password='" & txtPassword.Text & "' collate Latin1_General_CS_AS", cn)
        cmd.Parameters.AddWithValue("@UserID", txtUserName.Text) 'protects the database from SQL Injection
        cmd.Parameters.AddWithValue("@Password", txtPassword.Text) 'protects the database from SQL Injection

        dr1 = cmd.ExecuteReader
        ctr = ctr + 1
        If dr1.Read Then
            frm.Show()
            ctr = 0
            Hide()
        ElseIf ctr < 3 Then
            MessageBox.Show("Incorrect Subject Code,User Name or Password. Please try again.", "Wrong data entered", MessageBoxButtons.OK, MessageBoxIcon.Asterisk)
        Else
            MsgBox("Unathorized access. Aborting...")
            Close()
        End If
        dr1.Close()
    End If
End Sub

Ответы [ 3 ]

1 голос
/ 19 декабря 2011

PS Akaglo, лучший способ проверить, остались ли какие-либо поля пустыми, это использовать метод String.IsNullOrEmpty ().Ваш метод не обнаружит никаких нулевых или пробельных символов.

1 голос
/ 18 декабря 2011

Использовать параметризованный запрос

    Dim cmdText As String = _
                    "INSERT INTO Customer(UserName, [Password]) VALUES (@UserName,@Password)"
    Dim cmd As SqlCommand = New SqlCommand(cmdText, con)
    With cmd.Parameters
        .Add(New SqlParameter("@UserName", txtUserName.Text))
        .Add(New SqlParameter("@Password", txtPassword.Text))
    End With
0 голосов
/ 19 декабря 2011

В поставщиках членства .NET вы получите хеширование и заполнение, предоставляемые библиотекой .NET, которые должны быть правильно реализованы.Это ИМХО гораздо предпочтительнее для раскрутки собственного решения.Здесь есть введение в членство

Если вы предпочитаете, чтобы ваша реализация не включала в себя начальную и начальную части хеширования.Заполнение может быть таким же простым, как добавление случайной строки к исходному паролю до его хеширования.Затем вы сохраняете хеш и семя в базе данных.Когда пользователь вводит пароль, вы просто читаете начальное число и сравниваете хэши.Обратите внимание, что когда вы создаете случайные строки для криптографических целей, вам не следует полагаться на Random, а вместо этого использовать какой-то криптографически безопасный генератор случайных чисел .System.Security.Cryptography также содержит реализации многих подходящих алгоритмов хеширования (sha1, sha256 или аналогичных).

Опять же: По моему мнению, вы должны пойти на решение, использующее SqlMembershipProvider, чтобы избежать повторной реализации критических вопросов безопасности.1012 *

...