vb.net - VB.NET 中的 MD5 哈希

标签 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

最佳答案

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

See this answer使用 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==

哈希应该用salt来完成。这是添加到哈希中的数据,使结果更难以预测(有常见密码的哈希结果的字典,例如“密码”;盐会改变结果):

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

盐应该使用加密随机数生成器创建,如 SHA Version 中所示。 。将盐转换为文本(十六进制或 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

关于vb.net - VB.NET 中的 MD5 哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23513831/

相关文章:

vb.net - 类 'clsGetHeaderValue' 无法编制索引,因为它没有默认属性

perl - 记录 IP 地址的唯一性,而不存储 IP 地址本身以保护隐私

java - 比较两个 .class 文件的哈希值

database - 密码恢复 : How to decrypt an md5 encrypted password?

php - Javascript 相当于 PHP 的 md5() ,它也适用于多字节字符串?

Java MD5 哈希函数给出不正确的哈希值

.net - 转换为 .NET 4 后,在 VS2010 中将字段附加到记录集的奇怪错误

vb.net - 获取目录中的所有文件夹和子文件夹

ASP.net 将 html 编码的代码插入页面

pandas - 特征哈希到底是如何工作的?