所以,我在这里遇到了一个问题,我有一个数据库,一个登录和一个注册,所有这些都在不同的类中,现在我需要在数据库中哈希密码并在登录时再次读出它,但是我不知道如何处理这个问题,我已经搜索了很多但是找不到任何有用的东西。
这是我的登录类
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
答案 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
会产生与FooBar
或FOOBAR
不同的散列。要创建不区分大小写系统,请在计算要保存的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)
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