【问题标题】:Hash with MD5 in VB.NET在 VB.NET 中使用 MD5 散列
【发布时间】:2014-05-07 09:24:46
【问题描述】:

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

这是我的登录类

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

【问题讨论】:

  • 你在哪里加密密码,你在哪里检查它?在您的代码中看不到任何反映您的问题的内容。
  • 也许我错过了它,从我目前看到的情况来看,我必须把它放到这个类中,对吧?或不?我完全糊涂了,甚至不知道该怎么办。

标签: vb.net hash md5


【解决方案1】:

请务必注意,MD5 不再被视为散列您希望保护的数据的好方法。有关漏洞的讨论,请参见维基百科。

See this answer 使用 SHA 散列。


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

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 散列结果的字典,例如“密码”;盐会改变结果):

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

Salt 应使用密码随机数生成器创建,如SHA Version 所示。将 salt 转换为文本(hex 或 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 类之类的东西。由于它是共享/静态类,因此不需要实例化:

  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

【讨论】:

    【解决方案2】:
    1. MD5 转换
    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 返回值,则有效登录,否则无效登录

    【讨论】:

      【解决方案3】:
         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
      

      【讨论】:

        【解决方案4】:

        这将是我的解决方案:

        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
        

        【讨论】:

        • 你应该描述你的解决方案
        猜你喜欢
        • 2016-09-19
        • 2019-05-08
        • 2012-06-17
        • 2014-11-18
        • 1970-01-01
        • 2012-04-19
        • 2013-08-29
        • 1970-01-01
        • 2023-04-09
        相关资源
        最近更新 更多