VB - Login mit MD5 klappt nicht

Jessica_R

Newbie
Registriert
Mai 2019
Beiträge
6
Hallo zusammen,

ich bin gerade dabei einen Login mit MD5 Verschlüsselung zu realisieren.
Leider klappt das noch nicht - immer "falsche daten"

Wenn ich den MD5 Teil weglasse klappt alles wunderbar. Es muss also an der Verschlüsselung liegen.
(ich habe auch schon versucht Benutzername UND Passwort zu verschlüsseln -> ging auch nicht)

Ich habe mir hierfür eine Anleitung
aus dem Internet als Vorlage gesucht.

Hier ist mein Code:

Code:
Imports System.Data.OleDb
Imports System
Imports System.Windows.Forms
Imports System.Security.Cryptography
Imports System.Text

Public Class frmLogin
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs)
        'Prüfer_registrieren.Show()
        'Me.Hide()
    End Sub

    Private Sub btnAbbrechen_Click(sender As Object, e As EventArgs) Handles btnAbbrechen.Click
        Me.Close()
    End Sub

    Private Sub btnAnmelden_Click(sender As Object, e As EventArgs) Handles btnAnmelden.Click



        Dim conn As OleDbConnection
        conn = New OleDbConnection

        conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Acer\Desktop\IHK-Bewertung_04-07-2019\ITAPIHK2018.accdb;
        Persist Security Info=False;"


        conn.Open() ' Verbindung öffnen


        'Definition Benutzer / Passwort -> MD5 verschlüsselt
        Dim benutzer As String = (txtNutzername.Text)
        Dim passwort As String = MD5StringHash(txtPasswort.Text)


        Dim myAdapter As New OleDbDataAdapter

        Dim Abfrage As String = "SELECT * FROM tbl_logpruefer WHERE  User='" + Replace(benutzer, " ", "") + "' AND PW='" & Replace(passwort, " ", "") & "'"
        ' Das ist die Abfrage welche Prüft ob der Account existiert.Die txt_benutzer ist die Textbox in der der Benutzername eingeben wird und txt_passwort bekommt das Passwort

        Dim myCommand As New OleDbCommand
        myCommand.Connection = conn
        myCommand.CommandText = Abfrage
        myAdapter.SelectCommand = myCommand

        Dim myData As OleDbDataReader
        myData = myCommand.ExecuteReader()
        ' Hier startet man die Abfrage

        If myData.HasRows Then
            ' Wenn die Abfrage Einträge enthält / also der Benutzer und das Passwort stimmen überein
            MsgBox("Einloggen erfolgreich !")
            conn.Close()
            conn.Open()

            Bewertungsbogen.Show()
            Me.Hide()

        Else 'Sonst wird angezeigt das die Daten falsch sind
            MsgBox("Falsche Daten")
        End If

    End Sub
End Class

Das ist der MD5 code:
Das ist ein Modul, das ich erstellt habe.

Code:
Imports System.Security.Cryptography
Imports System.Text

Module Verschlüsselung

    Public Function MD5StringHash(ByVal strString As String) As String
        Dim MD5 As New MD5CryptoServiceProvider
        Dim Data As Byte()
        Dim Result As Byte()
        Dim Res As String = ""
        Dim Tmp As String = ""
        Data = Encoding.ASCII.GetBytes(strString)
        Result = MD5.ComputeHash(Data)
        For i As Integer = 0 To Result.Length - 1
            Tmp = Hex(Result(i))
            If Len(Tmp) = 1 Then Tmp = "0" & Tmp
            Res += Tmp
        Next
        Return Res
    End Function

End Module
 
Encoding.ASCII ist keine gute Idee

Versuche mal:
Code:
    Public Function MD5StringHash(password As String) As String
        Return BitConverter.ToString((New System.Security.Cryptography.MD5CryptoServiceProvider).ComputeHash(Encoding.Unicode.GetBytes(password))).Replace("-", "")
    End Function
 
  • Gefällt mir
Reaktionen: Raijin
1. SQL Injection. Bitte grundsätzlich keine SQL queries mit normalen Strings bauen. Damit öffnest du Tür und Tor für Angriffe mit SQL Injection. Sobald jemand in den Benutzername oder das Passwort etwas in der Art "'; DROP ALL TABLES;" eingibt, ist deine Datenbank weg. Egal ob du die Datenbank alleine nutzt oder nicht, sowas sollte man sich sofort abgewöhnen. Beim nächsten Mal macht man das sonst nämlich wieder und dann it's plötzlich für eine Webseite gedacht.............
Nutze stattdessen parametrisierte Queries.

2. Versuche zunächst einmal, nicht direkt im Query auf das Passwort zu machen, sondern hol dir das Passwort bzw. den Hash des PWs mit einem skalaren Query aus der DB und vergleiche es dann mit dem Hash des eingegeben Passworts. Evtl klappt es so besser.

3. In Zeile 57+58 machst du die Verbindung zu und dann gleich wieder auf.

4. Try catch für Fehlerbehandlung nutzen

5. Using für temporäre Ressourcen (zB das command bzw den reader)
 
Kannst Du das Enncoding evtl. wechseln?

Data = Encoding.ASCII.GetBytes(strString)

evtl. liegt der Fehler genau in dieser Zeile

Versuche eine UNICODE-Encoding
und probiere das mal aus.
 
  • Gefällt mir
Reaktionen: Raijin
Hier dürfte ein Encoding Problem vorliegen. .net Strings sind UTF8...

greetz
hroessler
 
Hallo, danke schon mal für die Antworten.

Das mit dem "Data = Encoding.ASCII.GetBytes(strString) "
war so in der Anleitung mit drinnen.

Ich werde hier schauen, ob ich eine Alternative dazu finde.

Bezüglich: "
SQL Injection. Bitte grundsätzlich keine SQL queries mit normalen Strings bauen. Damit öffnest du Tür und Tor für Angriffe mit SQL Injection. Sobald jemand in den Benutzername oder das Passwort etwas in der Art "'; DROP ALL TABLES;" eingibt, ist deine Datenbank weg. Egal ob du die Datenbank alleine nutzt oder nicht, sowas sollte man sich sofort abgewöhnen. Beim nächsten Mal macht man das sonst nämlich wieder und dann it's plötzlich für eine Webseite gedacht.............
Nutze stattdessen parametrisierte Queries. "

Kennt ihr hier gute Quellen um sich in dieses Thema einzulesen? Ich merke zwar schon was hier das Problem ist, aber habe Probleme das dann in den "eigentlichen Code" umzudenken.
Da muss ich mich in die Richtung wahrscheinlich erst komplett neu einlesen.

Das ist für mich allgemein das erste mal, dass ich Datenbanken nutze.
 
Code:
Dim sql as String = "SELECT * FROM TABLE_A WHERE COLUMN_A = @PARAM"
Dim connectionString as String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\mydatabase.mdb;User Id=admin;Password=;"
Using connection As New OleDbConnection(connectionString)
   Dim command As New OleDbCommand(sql)
   command.Connection = connection
   command.Params.Add("@PARAM", yourVariable)
   connection.Open()
    Dim reader As OleDbDataReader = command.ExecuteReader()
    While reader.Read()
        Console.WriteLine(reader.GetString(1)
    End While
End Using

Ich muss aber fairerweise die Quelle nennen, da ich in vb nicht so firm bin, erst recht nicht, wenn ich nur am Smartphone und Tablet hänge.

Quelle : Stackoverflow


Da sieht man übrigens auch das angesprochene using statement. Könnte man jeweils noch auf das command und den reader ausweiten. Dann noch ein try catch drumherum und man hat sichergestellt, dass die Ressourcen hinterher wieder freigegeben und etwaige exceptions abgefangen werden.
 
Zurück
Oben