我正在试图弄清楚如何在我的Access数据库中存储哈希。现在我已经通过使用用户ID腌制用户密码来生成哈希(我知道这不是很安全,但我的目的很多)。我还将哈希值存储在数据库中作为Base64字符串(手动,我还没有开发模块来自动执行),但是,当我从数据库中检索哈希时,我收到十六进制代码代替字符串。我知道字符串存储在数据库中,因为我手动存储它,所以我不太清楚发生了什么。
这是登录按钮的代码:
Sub prcLogin()
'Log User in
Dim ds As New DataSet
Dim blnCorrect As Boolean
'Fill DataSet with login details
prcConnectSet("SELECT * FROM Parent", "User", ds)
strUser = txtUser.Text
'Ensure username field is not blank
If strUser <> "" Then
'Search for the user
For Each Row In ds.Tables("User").Rows
Dim HashedPass As String = fncComputeHash(txtPass.Text & strUser)
Dim ContainedPass As String = Row.Item(3)
'Validate user
If strUser = Row.Item(0) Then
If HashedPass = Row.Item(3) Then
blnCorrect = True
lblLoggedAs.Text = Row.Item(1)
Exit For
End If
Else
blnCorrect = False
End If
Next
End If
这是哈希计算器的代码:
Function fncComputeHash(ByVal PasswordField As String) As String
Dim Hasher As New SHA256CryptoServiceProvider()
Dim encoder As New UTF8Encoding()
Return Convert.ToBase64String(Hasher.ComputeHash(encoder.GetBytes(PasswordField)))
End Function
但是当我运行此而不是返回我存储在数据库中的“rlzhYoiO4 + vpdJdsrFq5Sj9VBJ + FFYhIg9V5 + z + jeNI =”这样的值时,它返回的值如“5C6BED0D94B9BE8AFBC5C8CAC1E9D4BE03F556917C2611EC56F4E6F341EF60D9”。现在我该如何解决这个问题呢?我是否错误地存储了值?我应该将它们存储为字节数组吗?如果是这样,我该怎么做?或者我是否错误地检索了这些值?或者那些是好的,我应该在从数据库中取回后转换该值吗?
我对这整个加密方式都很新,甚至是身份验证,所以如果我做些蠢事,请告诉我。
提前致谢!
编辑:我在Access中使用“文本”数据类型。
编辑2:抱歉,我理解现在的困惑。我只存储哈希!不是明文密码。因此,从数据库接收的散列格式与用户ID和密码的格式相同至关重要。
编辑3:好的谢谢大家,我已经解决了。我需要使用SoapHexBinary函数将其转换为十六进制字符串。
答案 0 :(得分:0)
你确定这不是预期的行为吗?如果传递相同的值,它是否返回相同的哈希值?如果是,那么你已达到目的。你有一个用户名和密码的单向哈希字符串。
比较 所以你从数据库中检索has并存储表中的哈希
从数据库中获取用户标识和密码并计算哈希值
所以基本上,当用户输入他的用户名时,你从数据库中获取他的用户ID 从提供的密码计算has 而且你有两个哈希。
databasehash=gethashfromdatabase(user_id)
receviedhash=computehash(user_id,password)
现在,你可以比较两者。
注意:如果您想从数据库中获取数据或从表单中获取user_id有更多解释,我建议发布一个新问题
答案 1 :(得分:0)
当您处理强加密,强哈希(例如SHA1)时,了解所有这些哈希值都定义为对八位字符串(通常是无符号字符数组)起作用至关重要。它们不是流行编程语言所使用的“字符串”。
你所看到的,“5C6BED ......”只是八位字节的十六进制编码。只需调用该字符串,然后存储它,然后检索它,然后转换回原始值进行处理。
答案 2 :(得分:0)
我找到了我需要的东西。 “SoapHexBinary”功能是我所需要的。这是一个例子:
Function fncComputeHash(ByVal PasswordField As String) As String
'Compute SHA-256 Hash value
Dim Hasher As New SHA256CryptoServiceProvider()
Dim encoder As New UTF8Encoding()
Dim shb As New SoapHexBinary(Hasher.ComputeHash(encoder.GetBytes(PasswordField)))
Return shb.ToString
End Function