Datenbank Verbindung über ServerExplorer, in app.config stehen die Zugangsdaten im Klartext

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Datenbank Verbindung über ServerExplorer, in app.config stehen die Zugangsdaten im Klartext

    Hallo zusammen,

    ich habe eine Datenbank über den Server Explorer in ein DataSet gezogen.
    Nun stehen alle Zugangsdaten inkl. Passwort usw.. im Klartext in der app.config.

    Werden diese Daten später irgendwo angezeigt ?

    Dort steht auch etwas von MySetting

    "<add name="Mysql_Typisirtes_DataSet.My.MySettings.xxxxxxxxxConnectionString"

    Das wird doch wohl nicht irgendwo auftauchen wenn ich das Programm weitergebe. Oder ?

    bitte klärt mich mal auf.

    lieben dank
    Bernd
    Einfach testen? Kompilieren und dann in der Exe nach den Verbindungsdaten suchen. Ansonsten mal Dekompilieren und schaun ob sie drin stehen.

    Aber ich nehme es mal an, weil das Programm benötigt ja die Verbindungsdaten für die DB und somit müssen sie auch irgendwo im Programm hinterlassen werden.
    genau das wollte ich ja umgehen.
    Ich habe mir deine MySqlLib mal angesehen. Schönes Teil. Kompliment.

    Nur wenn ich ja mit Typisiertem DataSet arbeiten möchte macht er mir ja automatisch die app.config.
    Wie kann man das denn umgehen ?

    Eigentlich wollte ich das mit deine Lib umgehen.

    Nur könnte man das nun kombinieren ?
    Kann ich mir nicht denken. Deine Lib holt Tabellen, stellt aber keine dauerhafte verbindung bzw. DataSet zur Verfügung


    Resume:
    DataSet mit VB.NET - Sche...
    oder ?

    Gibt es da eine Lösung, kennt jemand eine ?


    lieben dank
    Bernd
    Meine Lib funktioniert ja auch nur mit einem externen WebServer (PHP + MySQL). Aber ist auch nicht besonder sicher, außer das die Daten verschlüsselt werden, aber prinzipiell könnte jeder mit dieser Lib auch Queries ausführen.

    Ansonsten habe ich mich mit DataSets noch nie beschäftigt. Fakt ist jedoch das wenn eine Verbindung aufgebaut werden soll lokal oder mit einer im Web mit externen Zugriff immer irgendwo die Verbindungsdaten stehen und oftmals auch im Klartext übertragen werden, also auch wenn man sie im Programm verstecken würde, beim Sniffen des Netzwerks würde man sie jedoch bekommen.

    Ob man das bei einer lokalen DB machen kann weiß ich allerdings nicht. Was du vlt. machen könntest, damit du keinen String angeben musst - den Strings stehen ja immer im Klartext auch in der Exe wenn man sie sich im Editor ansieht - du könntest Username und PW als ASCII Zahlen in ein ByteArray schreiben, somit würde man schonmal nicht ganz so einfach an sie rankommen.

    Bsp.:

    PW = "Dodo"

    VB.NET-Quellcode

    1. Dim b As Byte() = New Byte() {68, 111, 100, 111}


    Um wieder ein String zu bekommen

    VB.NET-Quellcode

    1. Dim Passwort As String = Encoding.Default.GetString(b)


    Das nun aus dem Kopf geschrieben, könnte aber funktionieren denke ich =)

    Dodo schrieb:

    Dim b As Byte() = New Byte() {68, 111, 100, 111}

    Dann stehen die Zeichen aber auch unmittelbar hintereinander und im Hex-Editor siehst du den String direkt. ;)

    Was ich gerne als Light-Verschlüsselung mache:
    Ich lege auf jedes Zeichen ein XOR mit 1F (Hex)
    XOR ist eine symmetrische "Verschlüsselung".
    Du kannst dieselbe Routine für Ver- und Entschlüsselung nehmen.
    1F eignet sich sehr schön, da aus "normalen" Zeichen wieder "normale" Zeichen werden.

    Die Methode eignet sich nicht als Hacker-Schutz, aber sehr gut zum obfuskieren einzelner Strings.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Das stimmt allerding, nun mit der XOR Routine könnte man es auch machen oder mit einem String der alle Zahlen und Zeichen enthält und in dem ByteArray stehen nur die Stellen der Zeichen in dem String, das würde somit auch nicht im Hex-Editor auffallen, da man die Variablendeklaration ja nicht dort sieht.

    VB.NET-Quellcode

    1. Dim Wort As String = "agtedvktroDEpqsO"
    2. Dim PW As String = Wort.Substring(10, 1) & Wort.SubString(9, 1) & Wort.Substring(4, 1) & Wort.SubString(10, 1)


    Das sind natürlich alles klein 100% Schutz, aber für die erste Einsicht reichts. Wer an sowas dran kommen will, kommts auch.
    erstmal vielen dank an euch.

    Aber die eigentliche Frage die ich mir stelle ist etwas anders gemeint. liegt vermutlich an meiner Erklärung.

    Ich habe eine MySql DatenBank, also Extern nicht Lokal.
    Wenn ich nun aus dem Server Explorer eine Tabelle in das DataSet ziehe, frickelt sich die IDE die app.config zurecht.
    Dort stehen die Zugangsdaten in Klartext.
    Nun muss doch die IDE "irgendwo" einen Code stricken um genau auf diese app.config zugreifen zu können.
    So meine Idee war nun, genau dort im Code einzusteigen und ihn dort so manipulieren,
    das er die Daten woanders herholt, also nicht mehr aus der app.config.
    Oder so zu Manipulieren wie ihr es beschreiben habt.
    Also die Zugangsdaten in der app.config. so maniupulieren das sie wenigsten nicht mehr im Klartext das sind.


    Wo schreibt die IDE diesen Code hin ?
    Kann man diesen Manipulieren ohne das das Programm dann abstürzt ?


    Wenn meine Erklärung immer noch unklar ist, versuche ich es anders zu Erklären.


    lieben dank
    Bernd
    Die Informationen für den ConnectionString werden wohl im Klartext in die app.config geschrieben.
    Von dort aus baut sich das Programm den Connectionstring zusammen.

    Da wo der Connectionstring zusammengebaut wird, würde ich eingreifen und den String selbst erzeugen.

    Alternativ gibt's hier noch einen Artikel von MS, wie man den Connectionstring in der app.config verschlüsseln kann:
    msdn.microsoft.com/en-US/library/89211k9b(v=VS.80).aspx
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Bei mir im Assistenten kommt ein Schritt, da mussich bestätigen, dassich den ConnectionString in den configurationseigenschaften speichern will.
    habich bislang immer bestätigt, aber ich vermute, es geht auch iwie, wenn man das nicht bestätigt.

    naja, habichjetzt nachgeguckt - dann codets er halt fest ein - das ist kaum besser.

    Aber mit der Sicherheit bin ich eh nicht sonderlich vertraut: Natürlich kannst du hinbasteln, dass der ConnectionString erst zur Laufzeit gebildet wird, aber ich weiß nicht, in welcher Form eine Query übers Internet geht: kann man da nicht auf jeden Fall den ConnectionString sniffen, wenn die Connection geöffnet wird?
    Also egal, ob du den nun zur Laufzeit vom User abfragst, oder einkompiliert hast, oder aus den Settings nimmst.
    Oder geht das garnet über TCP?

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

    Doch, geht über TCP.
    Und Sniffen geht immer.

    Um so etwas zu vermeiden müsste man wirklich auf dem Server selbst den Connection-String erzeugen.
    Das heisst aber, dass du ein Programm für die DB-Abfrage dazwischenschalten musst, das mit dem Client über ein gesichertes Protokoll verbunden ist.
    Da ist aber kein direkter DB-Zugriff com Client aus mehr möglich.

    Eine andere Variante ist, über eine SSH-Verbindung zu arbeiten.
    Erfordert allerdings auf allen beteiligten Rechnern installiertes SSH.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Da müsste es doch irgendwo Code-Fragmente dieser Art geben:

    VB.NET-Quellcode

    1. Sub OpenSqlConnection()
    2. Dim connectionString As String = GetConnectionString()
    3. Using connection As New MySqlConnection()
    4. connection.ConnectionString = connectionString
    5. connection.Open()
    6. End Using
    7. End Sub
    oder so ähnlich.
    Da würde ich einen Breakpoint setzen und mir den ConnectionString anschauen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Da kommste nicht so ohneweiteres dran.
    Das ist im Generierten Code einkompiliert - entweder hardcodet oder mit Abruf der ConfigurationsDatei.
    Aber mittm TableAdapterManager isses wieder supereinfach, da kann man einfach eine neue Connection zuweisen und geswitcht is.
    gugge Switch DB

    Ah - jetzt habichs richtig:
    Im DatasetDesigner kannst du für jeden TableAdapter einstellen: ConnectionModifier.Public.
    Dadurch erhält der TableAdapter eine Public Property Connection, die du manipulieren kannst.

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

    Jep,

    gefunden. Jetzt bleibt nur noch raus zu finden wie man das ändern kann.
    Weil dort steht nur die ServerAdresse und DatenBank ID , aber nicht das Passwort.

    Damit werde ich mich später mal beschäftigen.

    @petaod
    deine sache habe ich noch nicht gefunden.
    bleibe aber dran.


    danke euch beiden
    wie immer

    lieben dank
    bernd
    nein, er ist im generierten Code implementiert.
    Und da kann man nicht drin rumpfuschen, weil beim nächsten Öffnen des Dataset-Designers wird der Code neu generiert, und händische Änderungen werden überschrieben.
    Aber wie gesagt: ein generierter TableAdapter hat eine "Connection"-Property, die man ändern kann.