在Access数据库中存储SHA256哈希

时间:2012-02-04 05:57:16

标签: .net vb.net encryption sha

我正在试图弄清楚如何在我的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函数将其转换为十六进制字符串。

3 个答案:

答案 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