在VB.NET中使用MD5哈希

时间:2014-05-07 09:24:46

标签: vb.net hash md5

所以,我在这里遇到了一个问题,我有一个数据库,一个登录和一个注册,所有这些都在不同的类中,现在我需要在数据库中哈希密码并在登录时再次读出它,但是我不知道如何处理这个问题,我已经搜索了很多但是找不到任何有用的东西。

这是我的登录类

Imports System.Data

Imports System.Data.SqlClient

Imports System.Data.SqlServerCe

Public Class Login

    Inherits System.Web.UI.Page


    Private Sub LSend_Click(sender As Object, e As System.EventArgs) Handles LSend.Click

        If Bibliothek.EntryExists(LNAME.Text, "Username") = False Then
            LNAMELBL.Text = "Name oder Passwort Falsch."
            Exit Sub
        End If

        If Bibliothek.EntryExists(LPW.Text, "Passwort") = False Then
            LNAMELBL.Text = "Name oder Passwort Falsch."
            Exit Sub
        End If
        Dim UserN As String = LNAME.Text
        Session("Admin") = Bibliothek.GetValueBool(UserN, "IsAdmin")
        Session("USERNA") = Bibliothek.GetValueBool(UserN, "Username")

        Response.Redirect("/TSL/Home.aspx")
    End Sub
    Private Sub REG_Click(sender As Object, e As System.EventArgs) Handles REG.Click
        Response.Redirect("/TSL/Registrierung.aspx")
    End Sub

End Class

4 个答案:

答案 0 :(得分:7)

值得注意的是,MD5不再被认为是散列您希望保护的数据的好方法。有关漏洞的讨论,请参阅维基百科。

See this answer使用SHA进行散列。


对于密码,您可以将用户PW的哈希保存到数据库。因为它是单向的(您不能轻易地从哈希中获取原始值),这可以防止像看门人或客户服务代表这样的人能够在数据库中看到实际的密码。

Imports System.Security.Cryptography
Imports System.Text

Shared Function GetHash(theInput As String) As String

    Using hasher As MD5 = MD5.Create()    ' create hash object

        ' Convert to byte array and get hash
        Dim dbytes As Byte() = 
             hasher.ComputeHash(Encoding.UTF8.GetBytes(theInput))

        ' sb to create string from bytes
        Dim sBuilder As New StringBuilder()

        ' convert byte data to hex string
        For n As Integer = 0 To dbytes.Length - 1
            sBuilder.Append(dbytes(n).ToString("X2"))
        Next n

        Return sBuilder.ToString()
    End Using

End Function

根据您要保存的方式而不是使用StringBuilder创建十六进制字符串,您可以使用Convert.ToBase64String()

Return Convert.ToBase64String(dbytes)
' MyWeakPassword hashed:
'     to hex: DB28F1BE20A407398171295DD0D191E2
'  to Base64: 2yjxviCkBzmBcSld0NGR4g==

应该使用salt进行哈希处理。这是添加到散列中的数据,以使结果不太可预测(有常见PW的散列结果的字典,例如"密码&#34 ;; salt会改变结果):

Shared Function GetHash(theInput As String, theSalt As String) As String
...
      hasher.ComputeHash(Encoding.UTF8.GetBytes(theInput & theSalt))

应使用加密随机数生成器创建Salt,如SHA Version所示。将salt转换为文本(十六进制或Base64),然后与PW结合以获取PW哈希值。


要检查/比较用户的条目,只需对输入进行散列并将其与存储在数据库中的散列进行比较,使用相同的Salt(这意味着需要保存Salt):

 Shared Function CheckHash(hashedStr As String, newInput As String) As Boolean
    ' get the hash value of user input: 
    Dim newHash  As String = GetHash(newInput & dbSalt) 

    ' return comparison
    Return String.Compare(newHash, hashedStr, InvariantCultureIgnoreCase)
 End Function

如上所述,GetHash函数旨在用于类似CryptoTools类的内容。由于它是Shared / Static,因此不需要实例化类:

  thisHash = CryptoTools.GetHash(strToHash) 

注意:散列区分大小写,因此foobar会产生与FooBarFOOBAR不同的散列。要创建不区分大小写系统,请在计算要保存的MD5哈希值之前将原始字符串(如密码)转换为小写,对此进行相同操作他们后来输入的价值:

' ToLowerInvariant allows for foreign char sets
Dim str As String = PWTextBox.Text.ToLowerInvariant

If CheckHash(dbHashedValue, str) Then
    ' okie dokie
Else
    ' failed
End If

答案 1 :(得分:2)

  1. MD5转换
  2. Dim [source] As String = password_text_box.text 
    Using md5Hash As MD5 = MD5.Create()
    Dim hash As String = GetMd5Hash(md5Hash, source)
    

    2,将名称和哈希插入数据库

    3,验证

    在登录期间再次使用密码的MD5     运行SQL查询

      

    从表中选择名称,密码,其中Login ='“& username&”'和   密码='“& md5(用户输入传递)&”'

    如果dreader返回值,则有效登录其他无效登录

答案 2 :(得分:0)

   Private Function GetHash(strToHash As String) As String

    Dim md5Obj As New System.Security.Cryptography.MD5CryptoServiceProvider
    Dim bytesToHash() As Byte = System.Text.Encoding.ASCII.GetBytes(strToHash)

    bytesToHash = md5Obj.ComputeHash(bytesToHash)
    Dim strResult As New StringBuilder

    For Each b As Byte In bytesToHash
        strResult.Append(b.ToString("x2"))
    Next

    Return strResult.ToString

End Function

答案 3 :(得分:0)

这将是我的解决方案:

Public Sub _Enkripsi()

    Dim _DES As New TripleDESCryptoServiceProvider()
    Dim _HashMD5 As New MD5CryptoServiceProvider()

    _DES.Key = _HashMD5.ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(PasswordTextBox.Text))
    _DES.Mode = CipherMode.ECB
    Dim _DESEncrypt As ICryptoTransform = _DES.CreateEncryptor()
    Dim _Buffer As Byte() = System.Text.ASCIIEncoding.ASCII.GetBytes(PasswordTextBox.Text)
    _Password = Convert.ToBase64String(_DESEncrypt.TransformFinalBlock(_Buffer, 0, _Buffer.Length))

End Sub