Frage: Benutzer = ok! aber wie Password auslesen?

  • VB.NET

Es gibt 29 Antworten in diesem Thema. Der letzte Beitrag () ist von getsha.

    Frage: Benutzer = ok! aber wie Password auslesen?

    Nabend liebe Community,

    <--Worum es geht-->
    Ich habe mir ein Login zusammengestellt bei VB.Net via Online Datenbank. Benutzerdaten befinden sich in der Tabelle: "xf_user" unter usernamen.
    Aber die Passwörter werden woanders gespeichert, nämlich in der Tabelle: "xf_user_authenticate" unter remember_key. Das Passwort ist auch so verschlüsselt: "EnqtSwa6xspGA0blmzRluCkjVHssC-rZKNntybaJ"

    <--Frage zum ganzen-->>
    Wie bekomme ich es hin, dass er nun die Daten aus zwei Tabellen sucht. Einmal Usernamen in "xf_user" und das Password aus "xf_user_authenticate"
    Und das er die Verschlüsselung erkennt das, dass Passwort so geschrieben wird z.B. "Passwort123" und es nicht so herausfiltert "EnqtSwa6xspGA0blmzRluCkjVHssC-rZKNntybaJ"?

    <--SourceCode vom Login-->

    VB.NET-Quellcode

    1. Imports System.Data.SqlClient
    2. Imports MySql.Data.MySqlClient
    3. Public Class LoginForm1
    4. Dim MySqlConnection As MySqlConnection
    5. Private Sub OK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK.Click
    6. MySqlConnection = New MySqlConnection
    7. MySqlConnection.ConnectionString = "server=meinServer.de;Port=3306; user id=meinUsername; password=meinPassword; database=meineDatenbank"
    8. MySqlConnection.Open()
    9. Dim Myadapter As New MySqlDataAdapter
    10. Dim sqlquary = "SELECT * From xf_user WHERE username='" & UsernameTextBox.Text & "'AND password='" & PasswordTextBox.Text & "';"
    11. Dim command As New MySqlCommand
    12. command.Connection = MySqlConnection
    13. command.CommandText = sqlquary
    14. Myadapter.SelectCommand = command
    15. Dim Mydata As MySqlDataReader
    16. Mydata = command.ExecuteReader
    17. If Mydata.HasRows = 0 Then
    18. MsgBox("Fehler Username/Password falsch! o. nicht Registriert?")
    19. Else
    20. Form1.Show()
    21. Me.Close()
    22. End If
    23. End Sub
    24. Private Sub Cancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cancel.Click
    25. Me.Close()
    26. End Sub
    27. End Class


    Es wäre nett, wenn mir irgendeiner den Code zusammen basteln könnte. Da ich wenig MySql und VB.Net erfahrung habe.
    Ich bedanke mich schon mal im vorraus bei euch. Und freue mich auf postive Antworten. :)
    Public Signatur

    Dim Mfg As Mit freundlichen grüßen
    Dim Getsha As User.Getsha

    Mfg.Getsha()

    End Signatur

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „getsha“ ()

    Überlege genau: "Verschlüsselt" heißt, man kann es wieder entschlüsseln. Das heißt also, wenn man die Datenbank und den Schlüssel hat, kann man sich die Klartext-Passwörter aller Nutzer anschauen. Da Dein Programm SELECTs auf der Datenbank ausführt, ist davon auszugehen, dass jeder, der Dein Programm verwendet, alle Passwörter der anderen Nutzer einsehen kann!
    Sicher, dass das so Sinn macht?

    Und: Was sind Injections? - Kleine Erklärung
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Sinn würde es nicht machen, das stimmt! Aber für das erste als Anfänger für mich und paar Freunden wäre es aber Ideal zum lernen oder nicht? :o

    Wie kann man es denn entschlüsseln durch VB.net?
    Und Filtert die Passwörter heraus aus der zweiten Tabelle?

    Trotzdem vielen Dank für dein Tipp. :)
    Public Signatur

    Dim Mfg As Mit freundlichen grüßen
    Dim Getsha As User.Getsha

    Mfg.Getsha()

    End Signatur

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „getsha“ ()

    getsha schrieb:

    Wie bekomme ich es hin, dass er nun die Daten aus zwei Tabellen sucht. Einmal Usernamen in "xf_user" und das Password aus "xf_user_authenticate"
    Und das er die Verschlüsselung erkennt das, dass Passwort so geschrieben wird z.B. "Passwort123" und es nicht so herausfiltert "EnqtSwa6xspGA0blmzRluCkjVHssC-rZKNntybaJ"?


    Den "Mahnenden Finger" hast du ia bereits von @NikoOrtner bekommen. Daher verzichte ich darauf ;)

    Um Daten aus 2 Tabellen zu erhalten kannst du ein "Join" oder ähnliches durchführen. Oder halt 2 Abfragen durchführen.

    Dann kriegst du Benutzernamen und das verschlüsselte Passwort. Das Passwort muss nun entschlüsselt und mit der eingabe der TextBox verglichen werden.

    Der sicherste Weg ist das nicht, aber zum Üben find ichs nicht tragisch :)
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „mrMo“ ()

    @getsha Wenn das so ist wie es ist, kannst Du auch beide Informationen in einer Datenbank speichern. Das macht letztlich keinen Unterschied, ist aber wesentlich bedienerfreundlicher.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Diese Dinge gilt es erstmal zu beachten:
    WPF-Passwort Generator mit MD5 verschlüsselung

    Dann sollte man eine Function für den ganzen Login anlegen
    dev.mysql.com/doc/refman/5.7/en/create-procedure.html
    und über die QUOTE Funktion escapen, dann darf dein User natürlich nur die Rechte bekommen diese Procedure auszuführen, erst dann ist es schonmal halbwegs sicher.

    Andere Möglichkeit wäre über ein Serverseitiges Programm, was ich für wesentlich sinnvoller halte, da man viel mehr Kontrolle über Eingabe Daten hat.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Dankeschön für die ganzen positiven Nachrichten von euch. Zwar hab ich mir einiges durchgelesen aber auch nicht wirklich verstanden!
    Da es für mich schwierig ist als Anfänger, trotzden experimentiere ich bisschen damit rum.. :/

    Da ich es nicht hin bekomme, dass umzusetzen - frage ich mal anders.. Auf meiner Datenbank wo das Forum drauf läuft mit den Userdaten,
    kann ich das Password was so verschlüsselt: "EnqtSwa6xspGA0blmzRluCkjVHssC-rZKNntybaJ" wieder auf normal umstellen in der Datenbank
    das, dass Paswort so angezeigt wird: "Haus123" ?
    Public Signatur

    Dim Mfg As Mit freundlichen grüßen
    Dim Getsha As User.Getsha

    Mfg.Getsha()

    End Signatur
    Arbeite mit Hashes, nicht Verschlüsselungen. Die Problematik hat Niko oben ja schon angesprochen.
    Denn Verschlüsselungen kann man ja wieder "rückgängig machen". Bei Hashes geht das nicht, wenn die Algorithmen richtig gewählt sind. Dann musst Du das auch hashen und vergleichen.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Wie mach ich es denn mit den oben genannten Code? Mh.. vielleicht sollte ich es lassen. Da ich das ganze nicht begreife.
    Ob sicher oder nicht - es soll einfach nur simple sein. Die Logindaten auslesen von zwei spalten/Tabellen und entschlüsseln.
    Und wiedergeben ob es korrekt oder falsch ist. Und bei richtigen Daten die Form2 öffnen und bei falschen Daten nichts machen.
    Ich fühl mich nicht wirklich verstanden, aber das mag wohl daran liegen das ich euch nicht verstehe aber ihr das richtige meint. :/

    Die Datenbank trägt es automatisch ein, dass es so verschlüsselt ist vom Forum. Obwohl das Passwort: "Hallo123" wäre.
    Public Signatur

    Dim Mfg As Mit freundlichen grüßen
    Dim Getsha As User.Getsha

    Mfg.Getsha()

    End Signatur
    Ich würde den Ansatz zudem ganz anders angehen und ein PHP-Skript benutzen, das dann auf dem Server die Arbeit erledigt. Das ist auch sicherer, was das Lagern des Datenbank-PWs angeht.
    PBKDF2 wäre dann auch noch 'ne ganz wichtige Sache. Also wie gesagt, die PW dürfen nicht einfach so in der Datenbank rumliegen und Verschlüsseln ist keine gute Idee, da Du dann immer einen Schlüssel brauchst, der bekannt sein muss. Folglich kann man dann auch alle Passwörter entschlüsseln, wenn man den in die Hände bekommt. Daher Hashen, also "Einwegverschlüsseln". Das kann man nicht rückgängig machen und die Daten stehen nicht im Klartext in der Datenbank. Solche Funktionen, wie oben, hashen das dann relativ oft hintereinander. Salts sind dann auch noch wichtig. Es gibt dafür auch spezielle Algorithmen, die ganz gut sind und bisher als ungeknackt gelten. Damit wird verhindert, dass eben das Passwort aus dem Hash ermittelt werden kann. Bcrypt wäre da als Funktion zu nennen, die dann den Blowfish-Algo nutzt bzw. darauf basiert.
    Ganz einfach ist das halt nicht, aber man kann es durchaus relativ schnell verstehen, wenn man sich etwas damit beschräftigt.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Mh.. Verstehe ich dich nicht oder du mich nicht? :/
    Ich möchte ne' Login Form die eine Abfrage von Benutzernamen und Passwort macht in VB.Net.
    Die Benutzernamen sowie die Passwörter werden von ein Forum registriert und in ne' Datenbank gespeichert,
    in zwei verschiedenen Spalten/Tabellen. Den Benutzernamen bekomme ich mit den oben genannten Code herausgefilter
    und eine Bestätigung das er sich in der Datenbank befindet - Form 2 öffnet sich. Aber ich möchte das, dass Password von
    den Benutzernamen auch überprüft wird - gleichzeit mit den Benutzernamen und dann erst die Form2 öffnet, wenn beides
    korrekt angegeben wurden ist. Aber wie gesagt, dass Passwort wird so angezeigt in der Datenbank vom Forum: "EnqtSwa6xspGA0blmzRluCkjVHssC-rZKNntybaJ"
    Obwohl ich mich mit z.B Hallo123 registriert hab. Ich möchte das er das genauso wieder gibt dann. Und ob die oben genannte Methode nun schnell auslesbar ist,
    wäre mir in dem Sinne egal. Weil es nur zum lernen da sein soll. Da ich noch ein Anfänger bin. Und mit so einen simplen und leichten Login zufrieden bin.
    Wenn es funktioniert und ich mir den Code anschauen kann - warum und wie es funktioniert. Deswegen frage ich schon die ganze Zeit ob jemand den Code eventuell
    bitte erweitern kann wie ich es meinte. Ich möchte auch keine Copy&Paste machen - weil man dann auch nichts dazu lernt. Aber erstmal das Prinzip verstehen.
    Dankeschön schon mal im vorraus.
    Public Signatur

    Dim Mfg As Mit freundlichen grüßen
    Dim Getsha As User.Getsha

    Mfg.Getsha()

    End Signatur
    Die Form ist ja nicht das Problem, die ist nur dann die Anwendungsschicht.
    Also wenn das Passwort schon in der Form vorliegt, dann müsste man halt rausfinden, welcher Algorithmus auf die Passwörter angewandt wurde. Dazu kommt dann halt noch Salt etc.
    Um was für ein Forum handelt es sich denn? Also was für eine Forensoftware?

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Ich hab gelesen, dass man den Source davon einsehen kann. Kannst Dir ja mal anschauen, was die mit den Eingaben machen.
    Aber gibt es da nicht irgendwie die Möglichkeit einen Login von außen durchzuführen? Dass da irgendwas bereitgestellt wird an PHP-Zeugs z. B. Weil da selber in der Datenbank rumfriemeln ist ja unschön.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Das stimmt das es unschön ist.. Ich besitz leider zu wenige kenntnisse vom Forum so wie auch bei VB.Net. Da ich erst neu damit angefangen habe.
    Und mir viele Kenntnisse aneignen möchte um es zu lernen und es wieder zu geben. Ich hab auch nicht viel Ahnung davon.

    Könnte man irgendwie hilfe von dir bekommen - das man sagt, man könnte es per Teamviewer zeigen? Die Daten von der Datenbank oder so.
    Ich bekomm es einfach leider nicht hin.
    Public Signatur

    Dim Mfg As Mit freundlichen grüßen
    Dim Getsha As User.Getsha

    Mfg.Getsha()

    End Signatur
    Gib uns Am besten die Tabelle bzw. die Daten von zumindest einem Nutzer mitsamt Passwort, das du vergeben hast.
    Und zwar alle Daten die mit diesem User in Verbindung gebracht werden, denn irgendwo sollte auch der Salt stehen.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Die erste Tabelle wo die Benutzerdaten gespeichert wurden sind: "TestAccount"
    loaditup.de/files/840864_np8s4yebua.png

    Und ich schätze das remember_key in der zweiten Tabelle das Passwort ist. Habe sonst nichts aufälliges gesehen mit Passwort.
    loaditup.de/files/840865_4ttg9k2myq.png

    Und das alles hat mit den Begriff User zutun.
    loaditup.de/files/840866_kqcsmrnh26.png

    Dankeschön schonmal für deine Hilfsbereitschafft. :)

    Benutzernamen: TestAccount
    Password: 123456789
    Public Signatur

    Dim Mfg As Mit freundlichen grüßen
    Dim Getsha As User.Getsha

    Mfg.Getsha()

    End Signatur
    Ich bin mir jetzt relativ sicher, dass die relevanten Daten in data als serialisiertes PHP object stehen, also bräuchte man die Binärdaten davon

    Ich vermute mal das sind relevante Source-Dateien:
    xenforo/upload/library/XenForo/PasswordHash.php
    xenforo/upload/library/XenForo/Authentication/Core12.php
    von hier
    github.com/CMackiee/Xenforo/tree/gh-pages/source

    Core12.php:24 - verwendet unserialize, und später wird über data['hash'] zugegriffen
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Das heißt nun für mich? Ich muss die Dateien downloaden und da einfügen? oder wie muss ich das nun verstehen?
    Public Signatur

    Dim Mfg As Mit freundlichen grüßen
    Dim Getsha As User.Getsha

    Mfg.Getsha()

    End Signatur
    Die Zip herunterladen und das nötige aus dem PHP Code filtern und nach C# übersetzen, die relevanten Dateien hab ich dir ja bereits genannt.
    Anfangen könnte man mit unserialize:
    php.net/manual/de/function.serialize.php#66147

    Und wenn du mir noch die Daten aus der data Spalte gibst, kann ich das ganze auch verifizieren, ob ich soweit alles richtig gesehen hab(Und mit Daten daraus meine ich nicht "BLOB - 85B", was nur den Typ und Größe beschreibt, sondern die tatsächlichen Daten)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---