登录时如何比较数据库中的加密密码和新输入的密码?

时间:2019-05-25 05:04:24

标签: vb.net ms-access aes password-encryption

我正在做一个注册和登录表格,当用户在注册阶段输入密码时,我已经在其中加密了密码。因此,对于登录,我知道我需要在登录期间将数据库中的加密密码与新输入的加密密码进行比较。我不知道我是否缺少某些代码或我写错了代码。我知道这个问题已经问过几次了,但是我希望我能在这里得到一些帮助。我收到的错误只是一条消息,提示无法连接数据库

我已经找到了解决方法C# encrypted Login,并尝试遵循该代码,但是仍然有错误。

           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

我希望数据库中的加密密码可以与新输入的密码匹配,以便用户可以登录系统。

1 个答案:

答案 0 :(得分:2)

这是通常发生的情况。用户注册后,可以让他们提供用户名和密码,并确认密码。确认的想法是通常会屏蔽密码,并且您想确保他们不会通过保存错字来将自己锁定在帐户之外。然后,您对salt随附的密码进行哈希处理,并用salt和hash保存用户名。当用户登录时,您会得到该用户的密码,并对该密码进行哈希处理,然后将其与数据库中存储的哈希进行比较。如果哈希值匹配,则表明用户已成功通过身份验证。

哈希被认为比加密更可取,因为它是单向的,因此除了蛮力之外,没有人可以对哈希中的密码进行反向工程。该盐提供了额外的安全性,因为具有相同密码的两个用户仍不会具有相同的哈希。这意味着,如果用户忘记了密码,系统将无法将现有密码发送给他,因为它不知道密码是什么。在这种情况下,用户必须创建一个新密码。如果您使用网站或类似网站的忘记密码功能,并且它们告诉您当前密码是什么,则它们使用的安全性较低。如果他们让您创建了一个新密码,那么几乎可以肯定他们会使用哈希。

网络上有很多有关哈希和加盐的信息。还值得注意的是,ASP.NET Identity(可以在ASP.NET应用程序外部使用,如果需要的话)内置了密码哈希。