String ohne einsehbaren Key verschlüsseln

  • VB.NET

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

    String ohne einsehbaren Key verschlüsseln

    Mir ist klar, dass schon tausende andere Leute vor dem gleichen Problem gestanden haben, aber trotzdem habe ich bis jetzt nichts richtig passendes dazu gefunden.

    Ich habe einen Connection-String, mit dem man die Verbindung zu einem SQL-Server herstellen kann. Dieser soll verschlüsselt in einer XML-Datei im gleichen Verzeichnis wie
    das Programm liegen.
    msdn.microsoft.com/de-de/library/ms172831.aspx Das Beispiel ist leicht verständlich und funktioniert auch ganz gut. Allerdings habe ich momentan einfach einen
    Key im Quellcode stehen mit dem Ver- und Entschlüsselt wird. Dabei handelt es sich ja um eine massive Sicherheitslücke.

    Von daher die Frage, wie verschlüssele ich meinen Con-String ohne, dass der Nutzer ein Passwort eingeben muss und ohne einen Key im Quelltext?
    Option strict = on

    If it's stupid and it works it ain't stupid.

    Nils_Kr schrieb:

    ohne einen Key im Quelltext
    Hole ihn Dir aus einer nativen C++-DLL.
    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!

    Nils_Kr schrieb:

    ohne, dass der Nutzer ein Passwort eingeben muss

    Wieso ohne, dass der User das Passwort für die DB eingibt?
    Wenn du schon ein Passwort für eine DB einrichtest, dann soll doch auch der User das Passwort eingebn, sonst macht doch das ganze Passwort keinen Sinn
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell

    slice schrieb:

    auslesen
    Klar, wenn er als String drinne steht.
    Da muss man halt ein Wenig seine Fantasie und Kreativität üben, da kann man das Auslesen deutlich erschweren.
    Ansonsten halt Passwort- u.ä.-Dialog
    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!

    Radinator schrieb:

    Wenn du schon ein Passwort für eine DB einrichtest, dann soll doch auch der User das Passwort eingebn
    Nich unbedingt ... Ich habe ein ähnliches Problem mit meiner Access-DB ... Die hat auch ein PW und es wäre echt verdammt hinderlich und sehr userunfreundlich, wenn mein Programm ne MessageBox à la "Du willst einen neuen Datensatz anlegen. Wie lautet denn das Passwort? Hmmmm?" bringen würde ... Das PW soll die DB ja nur schützen, wenn man von außen auf sie zugreift und nicht vom Programm aus ...
    Ich hab' (unschöner Weise und weil ich mir nicht anders zu helfen wusste :( *asche auf mein Haupt*) das PW auch im ConnectionString mit drinne stehn :(
    Your computer is running... You better go chase it! :P :D
    Das Programm ist innerhalb einer Nutzergruppe frei verfügbar. Im Programm selbst wird die Nutzung der DB reglementiert. Es geht eigentlich nur darum,
    dass man den Con-String nicht einfach in ein anderes Programm eingeben kann um erweiterte Rechte zu bekommen.

    Im Prinzip müsste man die Nutzereinstellungen selbst anpassen, dann wäre es egal ob der Con-String bekannt ist oder nicht. Allerdings kann ich mich nach wie vor
    nicht so richtig mit dem SQL-Server Manager anfreunden.

    Nja im Endeffekt ist es eh höchst unwahrscheinlich, dass mein Programm dekompiliert wird, da es nicht öffentlich verfügbar ist.

    Btw: Wie wird das gemacht, wenn ein Programm die Option anbietet ein Passwort zu speichern. Liegt das dann auch irgendwo offen rum?
    Option strict = on

    If it's stupid and it works it ain't stupid.
    @RodFromGermany Das hilft nur nichts, spätestens wenn das Passwort/der Key verwendet wird liegt er im Memory.
    @Noyne Wie wäre es damit den User beim starten der Anwendung nach dem Passwort zu fragen und nicht jedes mal beim einfügen etc. von Datensätzen?

    slice schrieb:

    Wie wäre es damit den User beim starten der Anwendung nach dem Passwort zu fragen und nicht jedes mal beim einfügen etc. von Datensätzen?
    Nach dem Passwort für die Datenbank?! Im besten Fall weiß der User sein eigenes Passwort (das wird auch abgefragt), aber das Passwort für die DB sollen die ja gar nicht wissen!!! 8|
    Your computer is running... You better go chase it! :P :D

    Noyne schrieb:

    Die hat auch ein PW und es wäre echt verdammt hinderlich und sehr userunfreundlich, wenn mein Programm ne MessageBox à la "Du willst einen neuen Datensatz anlegen. Wie lautet denn das Passwort? Hmmmm?" bringen würde

    Naja...klar ist es nervig wenn bei jeden Datensatz die Frage kommt Pw eingeben...aber so macht das doch keine halb wegs sinnvolle Software, da gibtst du einmal das PW an(am Anfang) und das ist dann bis du das Prog zumachst, da iwo gespeichert(in einer privaten Variable vom Typen SecureString

    Noyne schrieb:

    Das PW soll die DB ja nur schützen, wenn man von außen auf sie zugreift und nicht vom Programm aus

    Ja schon, aber es bringt dir wie gesagt nix, wenn du ein PW hinterlegst, das aber dann im Quellcode speicherst.
    Außerdem: sieh voherigen Quote

    Noyne schrieb:

    Ich hab' (unschöner Weise und weil ich mir nicht anders zu helfen wusste *asche auf mein Haupt*) das PW auch im ConnectionString mit drinne stehn

    Wie bereits in Quote #1 von mir erwähnt: Bau dir eine private Variable, in der du zu Beginn des Proggs das PW speicherst und dann zum Connecten dir rausziehst.
    Übrigens ist das eine gaaaaanz schlechte Idee, bei jedem Update/INsert/wasweißich jedesmal einen euen ConnectionSTring zu bauen(wenn du commandstring meinst, ist das was anders ;D)
    Mach dir am besten dafür einen privaten statischen ConnString+Connection, auf die du dann immer wieder zugreifst, musste hatl iwie threadsicher machen oder für den Zugriff einen eigenen Thread starten...ach was weiß ich, ich arbeite nicht soo viel mit DB Zugriffen. Eher noch mit Zugriff auf Excel

    Hoff ich konnte helfen

    Lg Radinator
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell

    Radinator schrieb:

    Übrigens ist das eine gaaaaanz schlechte Idee, bei jedem Update/INsert/wasweißich jedesmal einen euen ConnectionSTring zu bauen
    Das weiß ich doch ;) Es war nur ein seeeehr übertriebenes Beispiel ...

    Ich guck' mir das mit dem SecureString mal an :D

    Das Ding ist halt, DAS DB-PW SOLL NIRGENDWO EINGEGEBEN WERDEN MÜSSEN!!!! ... Weder am Start, noch sonst irgendwann ... Der 0-8-15-User kennt das PW nicht mal ... Dann irgendwann danach zu fragen, ist eine schlechte Idee ...
    "Das Programm selbst" sollte es wissen, um mit der DB kommunizieren zu können und deswegen sollte es ja im ConnectionString mit drinne stehn ... oder sehe ich das jetzt komplett falsch ...

    Wir haben hier ein Programm, das nirgendwo das Access-DB-PW abfragt und trotzdem hat die DB eins, wenn ich ohne das Programm einfach die DB öffnen möchte ...
    Your computer is running... You better go chase it! :P :D

    Noyne schrieb:

    Das PW soll die DB ja nur schützen,


    Noyne schrieb:

    Der 0-8-15-User kennt das PW nicht mal


    Die zwei Aussagen wiedersprechen sich iwie IMHO
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    Nich wirklich ... Der Enduser soll das Programm nutzen und nicht so in der DB rumspielen können ... Zum Nutzen braucht er kein PW, zum "Drinrumspielen" bräuchte er eins ...
    In der Datenbank an sich soll nur einer drin rumspielen dürfen, der dazu auch berechtigt ist und das ist der 0-8-15-User eben nicht ...
    Your computer is running... You better go chase it! :P :D