如何加密和哈希密码

时间:2011-12-18 17:50:37

标签: vb.net tsql security hash salt

以下代码允许用户输入用户名和密码登录以输入学生的标记。 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 个答案:

答案 0 :(得分:1)

使用参数化查询

    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

答案 1 :(得分:1)

P.S。 Akaglo是检查是否有空字段的更好方法是使用String.IsNullOrEmpty()方法。您的方法不会检测到任何空格或空格字符。

答案 2 :(得分:0)

在.NET成员资格提供程序中,您将获得.NET库提供的散列和种子,这应该正确实现。这个恕我直言,更喜欢滚动你自己的解决方案。有一个introduction to membership here

如果您愿意进行实施,播种和散列部分不会过于复杂。播种可以像在对其进行散列之前将随机字符串添加到原始密码一样简单。然后,将哈希和种子存储在数据库中。当用户提供密码时,您只需读取种子并比较哈希值即可。请注意,当您为加密目的制作随机字符串时,您不应该依赖Random,而应该使用 cryptographically secure random generatorSystem.Security.Cryptography还包含许多合适的散列算法(sha1,sha256或类似算法)的实现。

再次:在我看来,你应该使用SqlMembershipProvider寻求解决方案,以避免重新实现安全关键的东西。