Die nachfolgende Klasse legt in der Registry einen neuen Schlüssel an und Speichert darin den Usernamen und einen Passwordhasch zu dem gespeicherten Usernamen.
Soll das Ausführen einer Anwendung nur bestimmten Usern gestattet sein, oder soll die Anwendung entsprechend geschützt werden, so kann man diese Klasse dafür verwenden, um den Schutz einzurichten.
In einem Formular wird eine Authentifizierung eingebaut, ist dies Erfolgreich - startet die Anwendung oder das Programm, wenn nicht - Shutdown/Exit/ was auch immer.
Die Klasse speichert zur zeit nur den Passwordhasch verschlüsselt, es ist jedoch kein Problem, auch den Usernamen zu Verschlüssen. Es kann der gleich Hash verwendet werden.
Imports Microsoft.VisualBasic
Imports System.Text
Imports System.Security.Cryptography
Public Class clsUserAndPassword
Public CurrentApplication As String = My.Application.Info.ProductName
''' <summary>
''' Die nächste Function Speichert Zwei Werte (Username und Password)
''' in der Registry.
'''
''' Es ist u.U. sinnvoller anstelle von HKEY_LOCAL_MACHINE
''' den Zweig HKEY_CURRENT_USER
''' zu verwenden.
'''
''' Bei HKEY_LOCAL_MACHINE müssen Sie dann darauf achten, dass
''' der User schreibenden Zugriff auf den entprechenden
''' Reg.-Key hat
'''
''' Bitte beachten Sie, dass nur das Password verschlüsselt
''' wird.
'''
''' Wollen Sie mehr Sicherheit, müssen Sie auch den Usernamen
''' verschlüsseln.
'''
'''
''' Aufruf aus einem Formular (Wert in Local Maschine:)
'''
''' Auf dem Formular befindet sich eine Textbox mit dem Namen PASSWORDTEXT
'''
''' ------------------------------------------------------------------------------
'''
''' Dim cls As New clsUserAndPassword
''' cls.SaveUserAndPasswordInRegistry(My.User.Name.ToString, PASSWORDTEXT.text)
'''
''' ------------------------------------------------------------------------------
'''
''' Es wird True oder False zurückgegeben
'''
'''
'''
'''
''' Aufruf aus einem Formular (Wert in CURRENT_USER)
'''
''' Auf dem Formular befindet sich eine Textbox mit dem Namen PASSWORDTEXT
'''
''' ------------------------------------------------------------------------------
'''
''' Dim cls As New clsUserAndPassword
''' cls.SaveUserAndPasswordInRegistry(My.User.Name.ToString, PASSWORDTEXT.text)
'''
''' ------------------------------------------------------------------------------
'''
''' Es wird True oder False zurückgegeben
'''
''' </summary>
''' <param name="txtUsername"></param>
''' <param name="txtPassword"></param>
''' <remarks></remarks>
'''
Public Sub SaveUserAndPasswordInRegistryCU(ByVal txtUsername As String, _
ByVal txtPassword As String)
Dim hashPassword As String = GetHash(txtPassword)
My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\" & CurrentApplication, txtUsername, hashPassword)
End Sub
Public Sub SaveUserAndPasswordInRegistry(ByVal txtUsername As String, _
ByVal txtPassword As String)
Dim hashPassword As String = GetHash(txtPassword)
My.Computer.Registry.SetValue("HKEY_LOCAL_MACHINE\Software\" & CurrentApplication, txtUsername, hashPassword)
End Sub
''' <summary>
''' Hier werden Username und Password aus der Registry wieder
''' ausgelesen und auf Richtigkeit geprüft.
''' Die Werte werden als TRUE (alles ok) oder FALSE (Fehler bei
''' Username oder Password) zurückgegeben.
'''
''' Wird im folgenden anstelle von My.computer.Registy
''' die Funktion Microsoft.Win32.Registry
''' verwendet, muss man auf die
''' geöffneten Schlüssel unbedingt wieder schließen
'''
''' </summary>
''' <param name="txtUsername"></param>
''' <param name="txtPassword"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Function CheckTypedPwdWithRegHash(ByVal txtUsername As String, ByVal txtPassword As String) As Boolean
'Hashwert aus txtPassword erstellen
Dim NewHashPassword As String = GetHash(txtPassword)
'Die in der Registry gespeicherten Werte wieder auslesen.
Dim ReadPasswordHash As String = Convert.ToString(My.Computer.Registry.GetValue( _
"HKEY_LOCAL_MACHINE\Software\" & CurrentApplication, _
txtUsername, Nothing))
' Vergleichen der Werte.
If (ReadPasswordHash = Nothing) Then
'Ungültiger Benutzer.
Return False
ElseIf (ReadPasswordHash = NewHashPassword) Then
' Username und Password sind OK.
Return True
Else
'Username OK, Password falsch.
Return False
End If
End Function
Public Function CheckTypedPwdWithRegHashCU(ByVal txtUsername As String, ByVal txtPassword As String) As Boolean
'Hashwert aus txtPassword erstellen
Dim NewHashPassword As String = GetHash(txtPassword)
'Die in der Registry gespeicherten Werte wieder auslesen.
Dim ReadPasswordHash As String = Convert.ToString(My.Computer.Registry.GetValue( _
"HKEY_CURRENT_USER\Software\" & CurrentApplication, _
txtUsername, Nothing))
' Vergleichen der Werte.
If (ReadPasswordHash = Nothing) Then
'Ungültiger Benutzer.
Return False
ElseIf (ReadPasswordHash = NewHashPassword) Then
' Username und Password sind OK.
Return True
Else
'Username OK, Password falsch.
Return False
End If
End Function
Public Function GetHash(ByVal plainText As String) As String
'Hier wird ein Hashwert erstellt. Es wird ein leerer String
'zurückegegebenn wenn etwas nicht stimmt.
'
Dim simpleByte As Byte()
Dim ApplicationHash As MD5CryptoServiceProvider
Dim ApplicationHashBytes As Byte()
Dim ApplicationHashText As String
Try
' Hier wird der Textwert in ein ByteArray geschrieben
simpleByte = Encoding.UTF8.GetBytes(plainText)
'Auswahl eines CryptoServiceProviders
ApplicationHash = New MD5CryptoServiceProvider
'Alternative
'Dim ApplicationHash As SHA1CryptoServiceProvider = New SHA1CryptoServiceProvider()
'Hashwert aus den Bytes
ApplicationHashBytes = ApplicationHash.ComputeHash(simpleByte)
'Umwandeln von hashwerten ind Hexadcimalwert
ApplicationHashText = Replace(BitConverter.ToString(ApplicationHashBytes), "-", "")
Return ApplicationHashText
Catch
Return "Es ist ein Fehler aufgetreten"
End Try
End Function
End Class
Kommentare zum Snippet