Vb.net 为什么我的密码没有使用AES加密在数据库中加密?

Vb.net 为什么我的密码没有使用AES加密在数据库中加密?,vb.net,aes,password-encryption,encryption-asymmetric,Vb.net,Aes,Password Encryption,Encryption Asymmetric,我想用AES加密我的密码,但它会在数据库中保存为纯文本。我用互联网上的例子运行了一些代码,它确实加密了数据库中的纯文本。我不知道为什么它不能在我的代码中实现。帮助我加密密码:) 以下是我迄今为止所尝试的: Private Function Encrypt(clearText As String) As String Dim EncryptionKey As String = "MAKV2SPBNI99212" Dim clearBytes As Byte()

我想用AES加密我的密码,但它会在数据库中保存为纯文本。我用互联网上的例子运行了一些代码,它确实加密了数据库中的纯文本。我不知道为什么它不能在我的代码中实现。帮助我加密密码:)

以下是我迄今为止所尝试的:

Private Function Encrypt(clearText As String) As String
    Dim EncryptionKey As String = "MAKV2SPBNI99212"
    Dim clearBytes As Byte() = Encoding.Unicode.GetBytes(clearText)
    Using encryptor As Aes = Aes.Create()
        Dim pdb As New Rfc2898DeriveBytes(EncryptionKey, New Byte() {&H49, &H76, &H61, &H6E, &H20, &H4D, _
         &H65, &H64, &H76, &H65, &H64, &H65, _
         &H76})
        encryptor.Key = pdb.GetBytes(32)
        encryptor.IV = pdb.GetBytes(16)
        Using ms As New MemoryStream()
            Using cs As New CryptoStream(ms, encryptor.CreateEncryptor(), CryptoStreamMode.Write)
                cs.Write(clearBytes, 0, clearBytes.Length)
                cs.Close()
            End Using
            clearText = Convert.ToBase64String(ms.ToArray())
        End Using
    End Using
    Return clearText
End Function

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Not Me.IsPostBack Then
        Dim cn As String = ConfigurationManager.ConnectionStrings("xxxx").ConnectionString
        Using cs As New SqlConnection(cn)
            Using cmd As New SqlCommand("SELECT * FROM zzzz")
                Using sda As New SqlDataAdapter()
                    Dim dt As New DataTable()
                    cmd.CommandType = CommandType.Text
                    cmd.Connection = cs
                    sda.SelectCommand = cmd
                    sda.Fill(dt)
                End Using
            End Using
        End Using
    End If
End Sub



Private Sub btnSubmitAdd_Click(sender As Object, e As EventArgs) Handles btnSubmitAdd.Click 'FUNCTION IS EXECUTED WHEN BUTTON SUBMIT IS CLICKED


    If Request.Form("pass1") = Request.Form("pass2") Then 'CHECK IF FIRST AND SECOND PASSWORD IS THE SAME
        cs.Open()
        cmd.CommandText = "INSERT INTO zzzz (user_id, user_name, user_password, user_rank, user_section, user_securitycode) VALUES ('" & Request.Form("userid") & _
                "','" & Request.Form("name") & "','" & Request.Form("pass1") & "','" & Request.Form("privilege") & _
                "', '" & Request.Form("section") & "', '" & Request.Form("user_securitycode") & "')" 
        cmd.Connection = cs
        cmd.Parameters.AddWithValue("@user_password", Encrypt(Request.Form("pass1")))
        cmd.ExecuteNonQuery()

        cs.Close()

您对本地数据库对象和
使用
页面中的
块做得非常好。我很抱歉看到你因为这个按钮代码而放弃了它。尽管如此,我不认为在
页面中拖拽所有数据,然后在不使用的情况下丢弃这些数据有什么意义

插入的每个值都应设置为
参数
。如果做不到这一点,就会为sql注入打开大门。我看到您尝试使用密码执行此操作,但在Insert语句中没有名为“
”@user\u password“
的参数。这就是为什么它没有被加密

对于Sql Server,
.Add
方法优于
.AddWithValue
。看见 和 还有一个: 这是另一个

我不得不猜测参数的数据类型和字段大小。检查数据库中的实际值,并相应地调整代码。如果参数是数字类型,请确保将
.Value
变量转换为正确的类型

我有点担心userid。新用户如何拥有用户ID?我怀疑这个字段是表的主键,是一个标识字段(自动递增)。您不在字段列表中包含标识字段,也不尝试为插入传递任何值

我对web应用知之甚少,但
Request.Form(“name”)
对我来说很奇怪。我认为这些只是
请求(“名称”)


我甚至没看你的密码。问题是为什么你的密码没有加密,我希望我能回答。

你对本地数据库对象和
使用
页面中的
块做得很好。加载
。我很抱歉看到你因为这个按钮代码而放弃了它。尽管如此,我不认为在
页面中拖拽所有数据,然后在不使用的情况下丢弃这些数据有什么意义

插入的每个值都应设置为
参数
。如果做不到这一点,就会为sql注入打开大门。我看到您尝试使用密码执行此操作,但在Insert语句中没有名为“
”@user\u password“
的参数。这就是为什么它没有被加密

对于Sql Server,
.Add
方法优于
.AddWithValue
。看见 和 还有一个: 这是另一个

我不得不猜测参数的数据类型和字段大小。检查数据库中的实际值,并相应地调整代码。如果参数是数字类型,请确保将
.Value
变量转换为正确的类型

我有点担心userid。新用户如何拥有用户ID?我怀疑这个字段是表的主键,是一个标识字段(自动递增)。您不在字段列表中包含标识字段,也不尝试为插入传递任何值

我对web应用知之甚少,但
Request.Form(“name”)
对我来说很奇怪。我认为这些只是
请求(“名称”)


我甚至没看你的密码。问题是为什么你的密码没有加密,我希望我能回答。

哦,天哪!Sql注入。如果我改变将数据插入数据库的方式以避免Sql注入,它会加密我的密码吗?我正在寻找答案。等等,真的吗?天哪,非常感谢。我知道Mary给了你一个很好的答案,但是它存储普通密码的原因是,
“,”&Request.Form(“name”)和“,”&Request.Form(“pass1”)和“,”&Request.Form(“privilege”)和“&Request.Form(“privilege”)应该是
”,“&Request.Form(“name”)和“,@user\u password”,“Request.Form”(&Request.Form(“privilege”)&
使用参数(我可能有一些引号错误)。哦,天哪!Sql注入。如果我改变将数据插入数据库的方式以避免Sql注入,它会加密我的密码吗?我正在寻找答案。等等,真的吗?天哪,非常感谢。我知道Mary给了你一个很好的答案,但是它存储普通密码的原因是,
“,”&Request.Form(“name”)和“,”&Request.Form(“pass1”)和“,”&Request.Form(“privilege”)和“&Request.Form(“privilege”)应该是
”,“&Request.Form(“name”)和“,@user\u password”,“Request.Form”(&Request.Form(“privilege”)&&
使用参数(我可能有一些引用错误)。详细解释,我非常感谢。今天有新课!我会尽力改变它,非常感谢你,玛丽。解释得很详细,我真的很感激。今天有新课!玛丽,我会尽力改变的,非常感谢你。
Private Sub btnSubmitAdd_Click(sender As Object, e As EventArgs) Handles btnSubmitAdd.Click 'FUNCTION IS EXECUTED WHEN BUTTON SUBMIT IS CLICKED
    Dim insert = "INSERT INTO zzzz (user_id, user_name, user_password, user_rank, user_section, user_securitycode) VALUES (@userid,@name,@password,@privilege,@section,@securityCode)"
    If Request.Form("pass1") = Request.Form("pass2") Then 'CHECK IF FIRST AND SECOND PASSWORD IS THE SAME
        Using cs As New SqlConnection(cn),
                cmd As New SqlCommand(insert, cs)
            cmd.Parameters.Add("@userid", SqlDbType.Int).Value = CInt(Request.Form("userid"))
            cmd.Parameters.Add("@name", SqlDbType.VarChar, 100).Value = Request.Form("name")
            cmd.Parameters.Add("@password", SqlDbType.VarChar, 100).Value = Encrypt(Request.Form("pass1"))
            cmd.Parameters.Add("@privilege", SqlDbType.VarChar, 100).Value = Request.Form("privilege")
            cmd.Parameters.Add("@section", SqlDbType.VarChar, 100).Value = Request.Form("section")
            cmd.Parameters.Add("@securityCode", SqlDbType.VarChar, 100).Value = Request.Form("user_securitycode")
            cs.Open()
            cmd.ExecuteNonQuery()
        End Using
    End If
End Sub