首页 > 解决方案 > 如何在登录时将数据库中的加密密码与新输入的密码进行比较?

问题描述

我正在做一个注册和登录表单,当用户在注册阶段输入密码时,我已经加密了密码。所以对于登录,我知道我需要在登录时将数据库中的加密密码与新输入的加密密码进行比较。我不知道我是错过了一些代码还是我写了错误的代码。我知道这个问题已经被问过几次了,但我希望我能在这里得到一些帮助。我得到的错误只是无法连接到数据库的消息

我已经找到了解决方案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

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

标签: vb.netms-accessaespassword-encryption

解决方案


这就是通常发生的事情。当用户注册时,您让他们提供用户名和密码,以及确认密码。确认的想法是密码通常被屏蔽,您希望确保他们不会通过保存拼写错误来将自己锁定在帐户之外。然后,您对使用 salt 提供的密码进行哈希处理,并将用户名与 salt 和哈希一起保存。当用户登录时,您会获得该用户的 salt 并对提供的密码进行哈希处理,然后将其与存储在数据库中的哈希值进行比较。如果哈希匹配,则用户成功通过身份验证。

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

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


推荐阅读