【问题标题】:How to salt and hash a password如何对密码进行加盐和哈希处理
【发布时间】:2013-08-29 20:22:26
【问题描述】:

下面的代码允许用户输入用户名和密码登录以输入学生的分数。 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

【问题讨论】:

  • 哈希与 SQL 注入无关。您需要学习如何正确使用参数。 (你还需要散列和加盐)

标签: vb.net tsql security hash salt


【解决方案1】:

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

【讨论】:

  • 请具体告诉我应该如何在我的代码中使用 String.IsNullOrEmpty() 方法。如果您能为我做这件事,我将不胜感激。
  • If String.IsNullOrEmpty(strName) Then Messagebox.Show("String is empty")
  • 拜托,我非常渴望使用您的建议,但我仍然无法在我的编码中看到如何去做。请根据您的建议编辑我的代码。提前致谢。
  • 我现在明白了。我很感激。
【解决方案2】:

使用参数化查询

    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

【讨论】:

    【解决方案3】:

    在 .NET 成员资格提供程序中,您将获得由 .NET 库提供的散列和播种,应该正确实施。这个恕我直言,非常适合推出您自己的解决方案。有一个introduction to membership here

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

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

    【讨论】:

    • 您能否详细介绍一下 SqlMembershipProvider 并且可能知道一篇在该方向上更进一步的文章?
    • SqlMembershipProvider 只是使用 MS SQL 作为用户存储的成员资格提供程序的具体化。它非常灵活,似乎提供了所需的功能。成员资格是一个很大的话题,但 msdn 提供信息bit.ly/sF9Ic8。要获得有关会员资格的更多信息,我认为单独提出一个问题是合适的。
    猜你喜欢
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 2014-01-25
    • 2010-11-30
    相关资源
    最近更新 更多