使用VB.NET进行MD5哈希处理

3
我在这里遇到了一些问题。我有一个数据库、一个登录和一个注册,它们都在不同的类中。现在我需要在数据库中对密码进行哈希处理,并在登录时再次读取它,但是我不知道如何处理这个问题。我已经搜索了很多,但是没有找到有用的信息。
以下是我的登录类:
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

1
你在哪里加密密码,又在哪里进行验证?我在你的代码中没有看到任何反映你问题的内容。 - Tim B James
也许我表达不太准确,从目前我所看到的来看,我需要把它放入这个类中,对吗?还是不用?我完全困惑了,甚至不知道该怎么做。 - Koinzell
5个回答

12

需要注意的是,MD5已不再被认为是保护数据的有效散列方法。请参阅维基百科以了解其漏洞的讨论。

请查看此答案以使用SHA进行哈希处理。


对于密码,您需要将用户的密码哈希值存储到数据库中。因为这是单向的(您无法轻松地从哈希值中获取原始值),这可以防止类似清洁工或客服代表等人员能够在数据库中查看实际密码。

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

根据您希望如何保存它,您可以使用Convert.ToBase64String()而不是使用StringBuilder来创建十六进制字符串:

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

哈希应该使用“盐”进行。这是添加到哈希中的数据,使结果更不可预测(例如,“密码”等常见密码的哈希结果会被保存在字典中; 盐可以改变结果):

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

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


要检查/比较用户输入,只需对输入进行哈希处理并将其与数据库中存储的哈希进行比较,使用相同的盐(这意味着需要保存盐):

 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

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&"' and Password ='"&md5(user input pass)&"'

如果dreader返回值,则为有效登录,否则为无效登录。


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

0

将字符串转换为MD5函数,适用于Visual Studio Basic 2022

Imports System.Security.Cryptography

Imports System.Text


Function CovertToMD5(retVal As String) As String
    Using MD5 = System.Security.Cryptography.MD5.Create()
        Return BitConverter.ToString(MD5.ComputeHash(Encoding.Default.GetBytes(retVal))).Replace("-", String.Empty)
    End Using
End Function

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

你应该描述你的解决方案。 - tryingToLearn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接