none
ConnectionString + mysql lesen und schreiben RRS feed

  • Frage

  • In meiner Anwendung wird ein ConnectionString zu dem mysql Server verwendet, was ist der beste Weg Details im ConnectionString zu verändern?
    Und vor allem die einzelnen Werte von dem connectionstring weiter zu verarbeiten?
    zb. einfach nur den Port auslesen und verändern?

    Augenblicklich ist der in der app.config gespeichert.
    Wie zerlege ich den ConnectionString, so das die einzelnen Daten für Eingabefelder verwendet werden können?
    zb.
    tb_dbServer = connectionstring server eintrag
    tb_dbUser = connectionstring user eintrag

    Ich verstehe, daß der = connectionstring in der app.config gespeichert werden kann und man auch die app.config als xml Dokument bearbeiten könnte,
    aber vielleicht gibt es einen eleganteren Weg.

    Ich weiß nicht ob mein Design klug ist, aber das Programm wird nur von ca.10 Mitarbeitern verwendet, alle verwenden den gleichen connectionstring Server Eintrag, die individuellen Berechtigungen ergeben sich aus deren Einlog Daten, aber wie verschlüssle ich am besten das initiale Passwort?

    Ich frage hier direkt in einem offiziellen MS Forum um nicht Schelte von Bademeistern zu bekommen :)

    Vielen Dank schon einmal vorab.


    • Bearbeitet microbender Donnerstag, 8. Dezember 2011 18:55
    Donnerstag, 8. Dezember 2011 18:53

Antworten

Alle Antworten

  • Hallo xpi3000,

    vor diesem Problem stand ich auch schon. Ich hab folgendermaßen gelöst:

    Ich habe mir eine kleine Anwendung geschrieben, die einen ConnectionString ver- und entschlüsseln kann. Zuerst habe ich mit diesem Tool den kompletten ConnectionString verschlüsselt, und diesen verschlüsselt in der Config abgelegt. Dann hole ich mir über den ConfigurationManager den ConnectionString aus der Config, entschlüssele ihn und voila...tut! ;-)

    Ich hoffe ich konnte dir weiterhelfen.

    Viele Grüße
    Holger M. Rößler


    Kaum macht man es richtig, schon funktioniert es
    Donnerstag, 8. Dezember 2011 19:18
  • Hallo,

    wenn auch für ASP.NET entworfen, kann man Anwendungseinstellungen auch für Windows Forms / WPF verschlüsseln,
    siehe http://stackoverflow.com/questions/4975377/encrypt-connection-string-in-non-asp-net-applications

    Mehr dazu in der MSDN: Verschlüsseln von Konfigurationsinformationen mithilfe der geschützten Konfiguration

    Eine VErbindungszeichenfolge kann man mit dem DbConnectionStringBuilder zerlegen und zusammenbauen,
    und ggf. in einem PropertyGrid zur Bearbeitung anbieten, beim MySql Connector wäre es der MySqlConnectionStringBuilder
    (leider noch nicht bei MySql ääh Oracle in der Dokumentation angekommen)

    Gruß Elmar

    Donnerstag, 8. Dezember 2011 19:49
    Beantworter
  • Hallo xpi3000,

    Ich weiß, dass oft empfohlen wird, Verbindungszeichenfolgen in der Anwendungskonfiguration zu speichern, auch von offizieller Seite. Und manchmal macht das auch Sinn.

    Mein Problem damit ist nur, dass Verbindungszeichenfolgen standardmäßig als Einstellungen auf Anwendungsebene erstellt werden, was Kopfzerbrechen beim Deployment bereitet. Die Anwendungskonfiguration liegt ja meist unter %programfiles%, bei der Anwendung, wo der Standarbenutzer keine Schreibrechte hat. Klar könnte man nun benutzerdefinierte Aktionen schreiben, die während der Installation die Anwendungskonfiguration entsprechend der Vorgaben ändern und ggf. verschlüsseln.

    Aber zum einen benötigt man während der Installation elevierte Rechte, was die Art des Deployments stark einschränkt, zum anderen, was tun, wenn ein Port in der Verbindungszeichenfolge während des Betriebs geändert werden muss? Bei (hunderten von) Installationen die app.config ersetzen? Das geht schon mal gar nicht, wenn Sections der app.config z.B. über DPAPI geschützt sind, da der Schutz maschinenspezifisch ist. Ganz zu schweigen vom Szenario in dem Windows neu aufgesetzt werden muss, was die verschlüsselte app.config aus der täglichen Band-Sicherung so ziemlich unbrauchbar macht.

    Soweit so gut. Nehmen wir nun gnädigerweise an, der Entwickler weicht auf die Benutzerebene der app.config aus, und benutzt die Verbindungszeichenfolgen der Anwendungsebene quasi nur als Startvorlage. Hier haben wir nun keine Schreibrechtprobleme mehr, wir könnten sogar die Verschlüsselung maschinenunabhängig gestalten, wenn nur nicht das da wäre, was DPAPI so reizend macht: das (dort fehlende) Problem der Schlüsselverwaltung.

    Darüber hinaus ist es fast ein Ding der Unmöglichkeit, die so über alle Rechner verstreuten Verbindungzeichenfolgen zentral zu verwalten. Das schafft heterogene Konfigurationszustände und gibt der Helpdesk die Möglichkeit sich noch lauter zu behaupten.

    Auch wenn nicht hunderte sondern nur einige wenige Mitarbeiter mit deinem Programm arbeiten und auch wenn Du kein FIPS 140-2 zertifiziertes Keymanagement brauchst, in nuce bleibt das Problem doch immer gleich und (e)skaliert mit jedem neuen Mitarbeiter der dazukommt.

    In der Arbeit mit dem SQL Server ziehe ich es deshalb vor, einfach die integrierte Authentifizierung zu benutzen. Keine Probleme mit der Verschlüsselung mehr. Datenvermeidung at its best. Ob es eine integrierte Authentifizierung für MySQL gibt, weiß ich nicht. Du könntest aber - vor allem im Enterpriseumfeld - die Datenbank hinter der Facade eines WCF-Dienstes verbergen, was sowohl das Problem der Schlüsselverwaltung als auch das der Konfiguration der Verbindungszeichenfolge stark vereinfacht. Die Kommunikation zwischen WCF-Client und WCF-Dienst kann über Zertifikate etc. abgesichert werden, so dass auch hier keine Passwörter mehr verwendet werden müssen. Dein Problem ist kein einfaches Problem. Wäre es so, wäre es längst gelöst.


    Gruß
    Marcel

    Donnerstag, 8. Dezember 2011 21:08
    Moderator
  • Vielen Dank für alle Eure Antworten.

    Wenn ich mit clickonce veröffentliche, dann scheint ja zu mindestens das Schreiben in die app.config kein Problem zu sein.

    @Holger - ist das eine extra Anwendung?

    @Elmar - DbConnectionStringBuilder ist genau das, was ich gesucht habe. Auch die anderen Links sind sehr hilfreich.

    @Marcel - Vielen Dank für Deine ausführliche Antwort, zum Glück ist meine Anwendung nur klein, aber kann ja noch größer werden.
    Integrierte Authentifizierung ist leider nicht möglich, weil zur Zeit die Datenbank auf einem entfernten VServer mit centOS läuft.
    Da die Anwendung auch von außerhalb laufen soll und wir noch keine statische IP-Adresse in der Firma haben, muß erst einmal mit
    mysql gearbeitet werden.

    Ich hoffe meine Form des Antwortens ist ok, wollte jetzt nicht einzeln zitieren.

    Montag, 12. Dezember 2011 19:41