Forum: PC-Programmierung c# statische strings verschlüsseln


von Datenbank-n00b (Gast)


Lesenswert?

Hallo,
ich muss in meinem c# Programm einen statischen string als Passwort 
hinterlegen, da man c# "relativ" einfach disassemblieren kann, würde ich 
diesen string gerne verschlüsseln.

Ich bin mir jedoch nicht ganz sicher ob das überhaut etwas nützt, den um 
etwas zu verschlüsseln benötige ich ja dann einen schlüssel, und dieser 
wiederum wäre dann auch statisch im Programm hinterlegt.
Würde eine Verschlüsselung also überhaupt etwas nützen?

Alternativ habe ich mir auch schon etwas Anderes überlegt: (Bitte nicht 
lachen, ich weiß nicht ob die Idee sinnvoll ist!)
Ich könnte das Alphabet als array hinterlege, dann das Passwort als 
Schleife aus dem array laden. Mein Passwort wäre dann zumindest nicht 
als Klartext im disassembly zu lesen, oder?

Wie macht man das "normalerweise" in einem Programm, wenn man nicht 
möchte das der User Passwörter auslesen kann oder Funktionen der 
Software selbstständig freischalten kann!?

von Karl H. (kbuchegg)


Lesenswert?

Datenbank-n00b schrieb:
> Hallo,
> ich muss in meinem c# Programm einen statischen string als Passwort
> hinterlegen, da man c# "relativ" einfach disassemblieren kann, würde ich
> diesen string gerne verschlüsseln.

Es gibt aber auch Programme, die den Code soweit umbauen, dass dieses 
"relativ leicht" zu einem "man kann es disassemblieren, aber man 
versteht das was rauskommt nur mehr sehr schwer" wird.


> Alternativ habe ich mir auch schon etwas Anderes überlegt: (Bitte nicht
> lachen, ich weiß nicht ob die Idee sinnvoll ist!)
> Ich könnte das Alphabet als array hinterlege, dann das Passwort als
> Schleife aus dem array laden. Mein Passwort wäre dann zumindest nicht
> als Klartext im disassembly zu lesen, oder?

Die Grundidee ist ok.
Anstalle eines direkten Textes, setzt man den Text irgendwie anders 
zusammen, so dass er als Text nicht mehr ins Auge springt. Unte 
rUmständen reicht dann schon eine einfache Cäser-Verschlüsselung: 
Einfach zu jedem Buchstaben eine Zahl dazuzählen und den so ablegen. 
Oder jeden Buchstaben mit einem konstanten (oder wechselndem) adnderen 
Wert ver-XODER-n. Oder die Buchstaben durcheinandermischen (1. mit 3. 
vertauschen, 2. mit 4., etc.). Oder das "Password" zwar direkt ablegen - 
benutzt wird aber ein Passwort in das an jede 5. Buchstabenposition noch 
ein 'G' eingefügt werden muss. Oder ...

> Wie macht man das "normalerweise" in einem Programm, wenn man nicht
> möchte das der User Passwörter auslesen kann oder Funktionen der
> Software selbstständig freischalten kann!?

Meiner Meinung nach ist der wichtigste Punkt:
Wer ist meine Klientell?

Wie wahrscheinlich ist es, dass diese über die Mittel und das Wissen 
verfügen, um 'einbrechen' zu können. Wie wahrscheinlich ist es, dass 
überhaupt das Interesse besteht, ein Programm zu knacken?

Ein Nebenerwerbsbäcker, der seinen Computer nur für die Buchhaltung 
benutzt und ansonsten nichts damit am Hut hat, wird auch dann nicht dein 
Programm zum Etikettendruck knacken können, wenn du die Passwörter im 
Klartext ins Programm reinschreibst.
Und für einen Hacker ist dein Etikettenprogramm wiederrum ziemlich 
uninteressant mit einer Verbreitung von 20 Stück in ganz Deutschland. Da 
arbeitet er lieber an der letzten Version von NeedForSpeed, die seinen 
Ruhm als Hacker ungleich mehr hebt.

Von daher ist ein Schutz, der von Lieschen Müller nicht zufällig 
ausgehebelt werden kann, oft ausreichend und alles darüber hinausgehende 
ein enormer Zeitaufwand, der nicht viel bringt. (Denn knackbar ist fast 
alles, wenn sich die richtigen Leute da drann setzen)

von Εrnst B. (ernst)


Lesenswert?

Datenbank-n00b schrieb:
> oder Funktionen der
> Software selbstständig freischalten kann!

Wenn du in deinem Programm nur Prüfen willst, ob der Benutzer das 
richtige Passwort eingegeben hat, musst du das Passwort nicht in deinem 
Programm speichern.
Verwende stattdessen einen Hash ("Quersumme", MD5, SHA*) über das 
Passwort (und evtl. Salt, Username, Versionsnummer, ...)

von Peter II (Gast)


Lesenswert?

es macht kaum sinn es zu verschleiern oder zu verschlüsseln. Dann setze 
ich halt den einen breakpoint auf die Stelle wo das Password verwendet 
wird. Dann ist es schon wieder im klartext.

Die Frage warum muss ein Password im Programm sein?

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Ernst hat recht, wenn das wirklich nur eine Prüfung sein soll (und nicht 
wiederum zur Ver/Entschlüsselung genutzt werden soll) ist ein Hash (dann 
aber besser nicht MD5) eine sinnvolle Alternative (mal abgesehen das 
diese eien Prüfung zu überspringen auch niemanden vor größere 
Hindernisse stellen sollte.
Bei allen anderen Fällen gilt: Wenn das "Secret" (Passwort, Schlüssel, 
Zertifikat) im Programm enthalten ist hat alles keinen Zweck.

von gaast (Gast)


Lesenswert?

Datenbank-n00b schrieb:
> Ich bin mir jedoch nicht ganz sicher ob das überhaut etwas nützt, den um
> etwas zu verschlüsseln benötige ich ja dann einen schlüssel, und dieser
> wiederum wäre dann auch statisch im Programm hinterlegt.

Nein. Stichwort asymetrische Verschlüsselung oder wie für Passwörter 
üblich, Hashverfahren. Üblich ist MD5.
Bringt aber reichlich wenig, schließlich kann man im disassemblierten 
Programm auch einfach die Abfrage entfernen.

Karl Heinz Buchegger schrieb:
> Die Grundidee ist ok.

Nein, sie ist völliger Unfug. Weshalb Passwörter auch nirgends so 
abgelegt werden.

Peter II schrieb:
> Dann setze
> ich halt den einen breakpoint auf die Stelle wo das Password verwendet
> wird. Dann ist es schon wieder im klartext.

Bei sinnvoller implementierung nicht. Du sollst auch nicht das Passwort 
entschlüsseln sondern die Usereingabe verschlüsseln (ja, ein Hash ist 
keine Verschlüsselung, ich weiß).

von Klaus T. (gauchi)


Lesenswert?

Ich habe noch nicht gelesen, ob er das Passwort nur prüfen will (dann: 
hashen, mit Salz) oder an irgendwen weitergeben muss (z.B. 
Datenbank-Passwort - würde zum Namen passen). In letzterem Fall nützt 
ist hashen eher kontraproduktiv. In letzterem Fall kann man das Passwort 
nicht sicher ablegen, man kann es 'hobby-hackern' nur zu anstrengend 
machen. Die wichtigste Frage ist also:
was willst du erreichen und wozu?

von Datenbank-n00b (Gast)


Lesenswert?

Das mit dem Hash geht leider nicht.
Mein Programm greift auf eine andere Datenbank via Netzwerk zu und muss 
sich dort mit Benutzernmae und Passwort anmelden.

Natürlich gibt es auch noch die Möglichkeit das Passwort im Netzwerk 
abzufangen (Netzwerksniffer u.ä.) dennoch möchte ich meine Software 
eben so sicher wie Möglich gestalten.

Es bleibt mir also nichts anderes übrig (alles andere ist nicht viel 
sicherer) als das PW als Klartext zu hinterlegen?

Ob das Klientell das PW ausliest weiß man nicht, meistens stellt sich 
soetwas erst im nachhinein raus, man denke z.B. an Frank Esselbach 
Beitrag "Kunde verhandelt nicht/zahlt nicht, Software deaktivieren?"

von Datenbank-n00b (Gast)


Lesenswert?

Nachtrag:
wobei es bei meiner software vermutlich bei weitem um diese Summen wie 
bei Frank Esselbach geht, ich mache gerade eher was für Hobbyanwender 
und Verein.

von Datenbank-n00b (Gast)


Lesenswert?

ohh man, fehlerteufel!
wobei es bei meiner software vermutlich bei weitem NICHT um diese 
Summen wie Frank...

von Peter II (Gast)


Lesenswert?

dann würde ich ein Nutzer/Passwort hinterlegen wo nur genau die 
erlaubten abfrage in der Datenbank möglich sind. Dann ist es egal ob 
jemand das Password ausliest oder nicht, er kann damit dann nichts 
anfangen.

von Ralf (Gast)


Lesenswert?

Einen Teil der Software in eine native (also nicht .NET) DLL auszulagern 
ist keine Option? Ich weiss ob/wie gut sowas zu knacken ist.

Ralf

von Sharping (Gast)


Lesenswert?

Vermutlich deutlich leichter als eine "obfuscated" .NET DLL...

von __tom (Gast)


Lesenswert?

Datenbank-n00b schrieb:
> Mein Programm greift auf eine andere Datenbank via Netzwerk zu und muss
> sich dort mit Benutzernmae und Passwort anmelden.

connection strings sollten in die app.config, dort lassen sie sich auch 
verschlüsseln.

http://msdn.microsoft.com/en-us/library/89211k9b(v=vs.80).aspx


wobei auch das weit entfernt von "kugelsicher" ist.

von Christian R. (mrrotzi)


Lesenswert?

Datenbank-n00b schrieb:
> Mein Programm greift auf eine andere Datenbank via Netzwerk zu und muss
> sich dort mit Benutzernmae und Passwort anmelden.

Hinterfragung der Applikations Architektur:
Deine client software sollte in diesem Fall nicht direkt auf eine DB 
zugreifen. Man könnte einen web service quasi dazwischen schalten und 
die Komminikation zwischen client und service zB mit einem Zertifikat 
absichern.
Jeder Mandant bekommt ein eigenes Zertifikat und du könntest sogar 
mitschreiben, wer deinen Service nutzt ; )
Datenbank Zugriffsinformation bleiben in deinem Service und landen 
bestimmt nicht auf irgend welchen clients.

Grüße,
Christian

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.