Verschlüsselung MySQL Datenbank und VB.NET Programm

  • VB.NET

Es gibt 34 Antworten in diesem Thema. Der letzte Beitrag () ist von vivil.

    Verschlüsselung MySQL Datenbank und VB.NET Programm

    Hallo Community,

    ich habe mal wieder eine Frage.
    Zur Zeit arbeite ich daran, meine Datenbank zu verschlüsseln.
    Ich habe ein Programm geschrieben, welches mir alle String Daten in der Datenbank verschlüsseln und auch wieder entschlüsseln kann.
    Dies würde z.B. so aussehen:

    idUser
    user
    passwort
    1
    Ra2Oq4YwPGYT7qx0f1KYjA4lwf5pcbrobFd+RPD9NSw=
    6oyAq311O90pzDXKI5X8osNqQ6Bwh0FW3wwBmv6E2fE=

    Nun ist meine Frage wie ich in meinem VB.NET Programm vorgehe, um die Daten auszulesen.
    Ich habe ein Login-Fenster in dem ich Username und Passwort angebe. Wenn ich auf den Button Login
    klicke, wird eine SQL-Abfrage ausgeführt, um nachzuschauen, ob der Benutzer überhaupt vorhanden ist.
    Danach kann dieser sich einloggen.

    Aber mein Problem ist, dass in dem Where-Teil der Abfrage der Benutzername nicht Verschlüsselt steht.
    Das hat zur Folge, dass der Benutzer nicht herauskommt und wir uns nicht einloggen können.

    Hat da jemand eine Idee, ob diese Methode der Verschlüsselung überhaupt Sinn ergibt oder wie ich nun weitervorgehe, um die richtigen Daten zu bekommen ?

    vivil
    Du musst natürlich, bevor du den Usernamen an die Datenbank übergibst, die Eingabe verschlüsseln und diese mit der DB abgleichen.
    Also nicht WHERE user = 'testuser' sondern WHERE user = 'Ra2Oq4YwPGYT7qx0f1KYjA4lwf5pcbrobFd+RPD9NSw='

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Erstmal vielen Dank für deine Antwort.

    Oh, ich habe in meinem Beitrag nicht erwähnt, dass wenn ich die Eingabe verschlüssel immer wieder neue Zeichen herauskommen.
    Bedeutet also, wenn ich einen Text zum ersten mal verschlüssel bekomme ich z.B. Ra2Oq4YwPGYT7qx0f1KYjA4lwf5pcbrobFd+RPD9NSw=.
    Wenn ich den selben Text nochmal verschlüssel, dann bekommen ich andere Zeichen heraus.

    Was kann man da machen ?
    das kann man bei aktuellen Verschlüsselungsmethoden knicken. sonst wären sie gegen knwon-Plaintext-angriffe verwundbar. Stell dir vor ein Angreifer hätte von allen Usern per Keylogging den plaintext, und durch eine einfache abfrage sämtliche verschlüsselten Strings. Nun könnte er so lange nach pattern suchen, bis er deinen schlüssel hat, und schon ists hinüber. Genau das verhindern aktuelle Verschlüsselungverfahren mitunter.

    Was mich aber interessiert. Wo ist das Programm, und wo ist die Datenbank? Programm beim Kunden und datenbank bei dir aufm Server?

    Wenn es nur darum geht, Lokal einen berechtigten User sich anmelden zu lassen. Solltest du dich nach Hashes umsehen. So steht nichts im Plaintext, beim raub einer DB kann man nichts auslesen, und dennoch ist ein Hash eindeutig für einen bestimmten Wert.
    Dann erklär mal beispielhaft, wann die Datenbank wo liegt. Liegt sie nur Lokal beim Kunden oder dessen Intranet, brauchste nicht viel machen. Oder wenn er sie durch einen VPN-Tunnel verfügbar macht. Ist sie jedoch frei im Internet wirds kritisch; auch für deinen Kunden. ;)

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

    Verschiedene Kunden benutzen die Datenbank die bei unserem Kunden liegen.
    Wiederum andere Kunden benutzen die Datenbank die im Internet liegt.
    Dies hängt von Lizenzen ab, die die Kunden haben.

    Aber die Datenbank liegt ja immer im Internet.
    Die Datenbank die bei unserem Kunden liegt, darum brauchen wir uns ja nicht kümmern.
    Aber die Datenbank die im Internet liegt, da wirds wie du schon sagtest kritisch...

    Was muss ich nun tun, damit ich mein obengenanntes Problem bewerkstelligen kann ?

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

    Ja, das geht. Schreib die Daten verschlüsselt rein und entschlüssele sie wieder nach dem Auslesen.

    Aber das ist nicht das, was du hören wolltest, nicht wahr ? Nein, einen simplen Parameter, der das alles für dich erledigt, gibt es nicht. Wäre auch zwecklos, weil man den Parameter schlicht absniffen kann und er somit auf einfachste Art umgangen werden kann.

    vivil schrieb:

    Ich möchte aber alle Daten in der Datenbank verschlüsseln und entschlüsselt wieder anzeigen.

    Das hängt sicherlich von Deinem Datenbank-Modell und Deiner Programmlogik ab, was hier der richtige Weg ist.
    Machbar ist so ziemlich vieles.
    Denke daran, wenn Du einen ganzen Datensatz verschlüsselt ablegst und dann danach suchen willst, musst Du erst alle Datensätze laden, entschlüsseln und dann danach suchen.
    Denke auch daran, dass Deine Anwendung mal mehrer 10.000 Datensätze haben könnte. Erst bei einer solchen Größe zeigt sich, wie gut das Modell ist.
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).

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

    Also der "richtige" Weg wäre (zumindest wenn es um Benutzernamen und Kennwörter geht), die Benutzernamen im Cleartype zu lassen, also unverschlüsselt und nur das Kennwort zu verschlüsseln. Allerdings sollte dieses dann auch nie wieder entschlüsselt werden können,... also am besten die Kennwörter mit MD5/SHA1 in der DB abspeichern.
    Zum Login in dann so:

    [PSEUDOCODE]

    wenn md5(textboxbenutzername.text) = datenbankfeld-password dann
    login = true
    else
    login = false

    Oder sehe ich das falsch?
    @baschniki Jo, nur sind MD5 usw. keine Verschlüsselungen, sondern Hashes ;)
    MD5 ist aber nicht mehr derart kollisionssicher, sodass ich gesalzenes und gepfeffertes SHA256 empfehlen kann.

    Allerdings bräuchte man zunächst auch eine SSL-verschlüsselte Verbindung, da man sonst ganz einfach die Daten manipulieren kann, wenn man mit dem PHP-Script kommuniziert. Ich hoffe mal, dass der TE mit PHP arbeitet, da sonst ja die MySQL-Credentials auslesbar sind und das so nicht wirklich funktioniert. Entsprechende Zertifikate kosten jedoch Geld.
    Außerdem darf die Überprüfung nur serverseitig stattfinden und das Passwort darf nicht bereits gehashed an den Server gesendet werden, sondern dieser muss den Hash bilden.

    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 :!:

    Trade schrieb:

    das Passwort darf nicht bereits gehashed an den Server gesendet werden, sondern dieser muss den Hash bilden.


    Schwachsinn, der Hash wird wird clientseitig und serverseitig gebildet. Der Hash wird vom Client an den Server gesendet und dort beide verglichen.

    Anders würde es doch keinen Sinn ergeben, dann würde das Passwort im Klartext übertragen werden....
    @Markus Jacobs Nein, das ist kein Schwachsinn, weil ich dann den Hash klauen bzw. abgreifen und diesen zum Server senden kann. Dann muss ich nicht mal das Passwort kennen, sondern kann direkt die Hashes verwenden. Am Besten wäre es nat. doppelt zu hashen, damit das Passwort nicht direkt ersichtlich ist, wie Du es meinst.
    Also dem Hash des Hashes zu bilden und zu vergleichen. Das gewährt jedoch auch nicht 100%ige Sicherheit.

    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 habe ich irgendwie ausgeblendet.... Da hast du schon Recht...
    Also beides ist extrem unsicher....
    Fraglich ist allerdings, ob es relevant ist sich jetzt bei dem dem Vorhaben des TE so gedanklich den Kopf darüber zu zerbrechen.