我在使用MS Access时遇到一个非常奇怪的问题。我在密码重置表单上使用了一些VBA代码。该代码对输入的密码进行哈希处理,然后将哈希值保存到用户表中。这是一个相关的摘录:
If newPW1 = newPW2 Then
MsgBox ("Passwords Match!")
hashPW = Encrypt(newPW1)
MsgBox ("HashedPW is " & hashPW)
updatePW = "UPDATE Users SET Password = " & hashPW & " WHERE Username = pwChangeUsrnm"
DoCmd.RunSQL (updatePW)
MSGbox是我的调试说明。我知道散列会很好地生成为一长串数字,所有这些都很好。不过,当我进入“用户”表的数据表时,该数字始终被转换为科学计数法。
这是数据表的屏幕截图。 bob.smith是代码运行后最终结果的一个示例,另外两个是我手动输入的乱码。该字段的格式设置为字符串,因此我不确定为什么我可以告诉项目始终为字符串时,为什么还要尝试将数字转换为SN。
我认为错误必须在SQL查询周围蔓延?如果有更好的方法可以做到这一点,那么我就会不知所措。
在此先感谢您的帮助!
数据表
设计视图
完整代码,以防万一:
Option Compare Database
Private Sub Command84_Click()
Dim hashPW As String
Dim updatePW As String
Dim checkName As String
checkName = Nz(DLookup("Username", "Users", "Username = pwChangeUsrnm"), "aaa")
MsgBox ("checkName set to " & checkName)
If pwChangeUsrnm = checkName Then
MsgBox ("Username Found")
If newPW1 = newPW2 Then
MsgBox ("Passwords Match!")
hashPW = Encrypt(newPW1)
MsgBox ("HashedPW is " & hashPW)
updatePW = "UPDATE Users SET Password = " & hashPW & " WHERE Username = pwChangeUsrnm"
DoCmd.RunSQL (updatePW)
Else
MsgBox ("Passwords Do Not Match!")
End If
Else
MsgBox ("Username not found")
End If
End Sub
答案 0 :(得分:0)
我认为安德烈(Andre)有权。我尝试调整哈希代码以添加字母字符,此方法奏效了,但随后我需要返回并在哈希的PW值周围添加单引号-即使不添加字母也可能会使代码正常工作。
If newPW1 = newPW2 Then
MsgBox ("Passwords Match!")
hashPW = Encrypt(newPW1)
MsgBox ("HashedPW is " & hashPW)
updatePW = "UPDATE Users SET Password = '" & hashPW & "' WHERE Username = pwChangeUsrnm"
DoCmd.RunSQL (updatePW)
也感谢Zaph对安全性的第二点评论,我将所有这些考虑在内。就此数据库而言,安全性不是一个太大的问题,因为它将位于现有安全性措施的后面。密码的散列只是为了避免以纯文本显示密码。尽管如此,了解这些额外的功能还是很有用的。