Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Sicheres, lokales Passwort
AbrahamM
myCSharp.de - Member



Dabei seit:
Beiträge: 3

Themenstarter:

Sicheres, lokales Passwort

beantworten | zitieren | melden

Hallo,

ich hoffe ich bin in diesem Forum korrekt. Falls nicht, bitte ich um Entschuldigung, ich bin zum ersten Mal hier.

Vor kurzem habe ich angefangen C# zu lernen. Als kleines Übungsprojekt habe ich mir dann überlegt, einen kleinen Passwort-Manager zu basteln, der mir automatisch sichere Passwörter generieren kann und diese direkt auch in einer Datei speichert. War bisher auch alles sehr lehrreich und ich bin fast fertig; bis auf eine Sache, wo mir keine gute Lösung einfällt.

Die Passwörter sollen natürlich nicht im Klartext irgendwo auf dem PC liegen. Sie sollen wenigstens Ansatzweise sicher sein, deswegen möchte ich die Datei verschlüsseln.
Meine Idee dabei war: Der Benutzer kann ein Masterpasswort festlegen und nur, wenn er das korrekte Passwort angegeben hat, dann wird die Datei entschlüsselt und die Passwörter können abgerufen werden.

Das Verschlüsseln und Entschlüsseln habe ich hinbekommen. Mein Problem ist nun eher das Masterpasswort. Auch dieses muss ich ja irgendwo speichern. Ich habe es als SHA512-Hash in einer Datei gespeichert. Nun kann aber natürlich theoretisch jeder kommen, die Datei mit einer eigenen Datei austauschen und schon kann er mit seinem eigenem Passwort die Datei entschlüsseln.

Kann mir da jemand einen Tipp geben ob und wenn ja, wie das besser zu lösen wäre? Mir fällt einfach nichts ein, jede Lösung die mir nun eingefallen ist, entpuppte sich nach etwas längerem Nachdenken als sehr einfach zu umgehen.

Ich würde mich sehr freuen, wenn mir jemand den ein oder anderen Tipp geben kann.

Vielen Dank!
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16110

beantworten | zitieren | melden

Zitat
Nun kann aber natürlich theoretisch jeder kommen, die Datei mit einer eigenen Datei austauschen und schon kann er mit seinem eigenem Passwort die Datei entschlüsseln.
Korrekt. Das ist von grundauf eine unsichere Infrastruktur und gilt für jede Art eines solchen "Master"-Vorgehens.
Leider ist Security through obscurity jedoch weit verbreitet bei Applikationen mit "lokalem Benutzer".

Unter Windows sollte man Credentials im Windows Credential Manager abgelegen, der ist genau für solche Zwecke da und hier werden zB auch Token von Microsoft Produkten, Git, Password Managern (zB 1Password) und Co abgelegt. Einfach mal öffnen, dann siehst, welche Applikationen das bei Dir so machen.
Es ist nicht notwendig das selbst zu basteln.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
dannoe
myCSharp.de - Member



Dabei seit:
Beiträge: 186

beantworten | zitieren | melden

Du musst deine Passwortdatenbank mit dem Masterpasswort (bzw. mit einem Hash des Passworts) verschlüsseln, dann kann keiner irgendwas austauschen.
So macht es bspw. auch KeePass. (Ein Open Source Passwortmanager geschrieben in C#)

Wenn dann jemand versucht die Passwortdatenbank mit einem falschen Passwort zu entschlüsseln, dann kommt nur Kauderwelsch raus.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16110

beantworten | zitieren | melden

Zitat von dannoe
Wenn dann jemand versucht die Passwortdatenbank mit einem falschen Passwort zu entschlüsseln, dann kommt nur Kauderwelsch raus.
Das ist ein Mechanismus zur Abwehr einer Brute-Force-Methode
Mir fällt leider der Name dazu nicht ein.

KeePass verwendet den WCM nicht aufgrund von Cross Platform Anforderungen bzw. unterstützt dieses Verhalten erst mit Version 2.0.
Zitat von https://keepass.info/help/base/keys.html
KeePass 1.x does not support encrypting databases using Windows user account credentials. Only KeePass 2.x and higher support this.
WCM ist die bessere und sicherere Wahl, wenn man diese in der Form nicht hat.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
AbrahamM
myCSharp.de - Member



Dabei seit:
Beiträge: 3

Themenstarter:

beantworten | zitieren | melden

Zitat von Abt
Unter Windows sollte man Credentials im Windows Credential Manager abgelegen, der ist genau für solche Zwecke da und hier werden zB auch Token von Microsoft Produkten, Git, Password Managern (zB 1Password) und Co abgelegt. Einfach mal öffnen, dann siehst, welche Applikationen das bei Dir so machen.
Es ist nicht notwendig das selbst zu basteln.

Vielen Dank, davon höre ich zum ersten Mal. Das werde ich mir mal genauer ansehen.
Zitat von dannoe
Du musst deine Passwortdatenbank mit dem Masterpasswort (bzw. mit einem Hash des Passworts) verschlüsseln, dann kann keiner irgendwas austauschen.

Dankeschön, warum auch immer ich nicht auf diese Idee kam - dabei ist das ja fast schon die naheliegendste Lösung.
private Nachricht | Beiträge des Benutzers
dannoe
myCSharp.de - Member



Dabei seit:
Beiträge: 186

beantworten | zitieren | melden

Ich glaube einer von uns hat die Frage falsch verstanden.

So wie ich es lese, hat Abraham eine Funktion die seine Datenbank verschlüsselt und entschlüsselt (mit einem festen Schlüssel, ungleich dem Masterpasswort) und er möchte dass die Datenbank nur mit einem bestimmten Passwort entschlüsselt werden kann. Um das zu erreichen hat er deswegen ein Passwort als Hash in einer Datei abgelegt. Wenn jetzt jemand die Datenbank entschlüsseln möchte, prüft er in seinem Programm ob das eingegebene Passwort gleich dem Hash in der Datei entspricht. Falls dem so ist dann stößt er den Entschlüsselungs-Mechanismus mit seinem festen Schlüssel (nicht dem Passwort) an.

D.h. in meinen Augen hat er nur nicht daran gedacht, dass die Verschlüsselungsfunktion selbst, das Masterpasswort verwenden kann. Dadurch muss auch nirgendwo das Masterpasswort gespeichert werden.
Zitat von Abt
Zitat von dannoe
Wenn dann jemand versucht die Passwortdatenbank mit einem falschen Passwort zu entschlüsseln, dann kommt nur Kauderwelsch raus.
Das ist ein Mechanismus zur Abwehr einer Brute-Force-Methode
Mir fällt leider der Name dazu nicht ein.
Nein, ich meine eine ganz normale symmetrische Verschlüsselung. Wenn ich etwas mit einem Schlüssel A verschlüssle und es versuche mit Schlüssel X zu entschlüsseln, dann kommt halt irgendwas raus.
Du meinst vermutlich die "Key derivation", dabei wird X-mal der Schlüssel "verformt" um so die benötigte Entschlüsselung bzw. Rechenzeit zu erhöhen.
Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von dannoe am .
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16110

beantworten | zitieren | melden

Zitat von dannoe
D.h. in meinen Augen hat er nur nicht daran gedacht, dass die Verschlüsselungsfunktion selbst, das Masterpasswort verwenden kann. Dadurch muss auch nirgendwo das Masterpasswort gespeichert werden.
Auch das ist halt nicht notwendig, wenn man einfach den WCM verwendet :-)

Im Endeffekt basiert aber auch der WCM (wie die meisten solcher Implementierungen) mit einer Master Key Struktur, nem Salt und anderen Zusätzen, zB das von Dir angesprochene PBKDF2.
Der WCM nimmt Dir also vieles ab: das sichere Speichern, das gesamte Verwalten, der sichere Zugriff.

Wozu das alles selbst machen? Unnötiger Aufwand mit Fehlerpotential.
Zitat von Abt
Du meinst vermutlic
h die "Key derivation", dabei wird X-mal (einstellbar) der Schlüssel "verformt" um so die benötigte Entschlüsselungszeit zu erhöhen.
Nein.

Lokale Passwort-Implementierungen haben ein großes Angriffspotential von Brute Force. Je schneller ausprobiert werden kann, desto schneller errät man an das Passwort.
Der einzige Schutz lokal davor ist, dass das Passwort möglichst komplex ist, zB durch Länge oder Salting etc.

Ein Verfahren zur Prävention ist, dass das Ausprobieren einfach länger dauert, in dem man dem Mechanismus so spät wie möglich sagt, dass das ausprobierte Passwort falsch ist.
Und basierend auf dieser Idee gibt eine Brute Force Abwehr-Architektur/Methode, die ein falsches (Master-)Passwort nicht bestätigt (aka "Das Passwort ist falsch"), sondern dann einfach ungültige/"kauderwelsche" Werte rauskommen - so hatte ich Dein "Kauderwelsch" verstanden.
Das streckt die Dauer eines BF Angriffs enorm hinaus, weil das Ausprobieren viel viel längert dauert (-> weil die Info fehlt, ob was falsch ist).

Der Windows Credential Manager arbeitet intern auch mit einem Master Password (weil als Implementierung DPAPI verwendet wird), aber man muss sich um das drum herum nicht kümmern.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
AbrahamM
myCSharp.de - Member



Dabei seit:
Beiträge: 3

Themenstarter:

beantworten | zitieren | melden

Zitat von dannoe
D.h. in meinen Augen hat er nur nicht daran gedacht, dass die Verschlüsselungsfunktion selbst, das Masterpasswort verwenden kann. Dadurch muss auch nirgendwo das Masterpasswort gespeichert werden.

Das ist übrigens genau richtig gewesen.

Wenn ich aber diesen Windows Credential Manager richtig verstanden habe, dann macht der genau das was ich manuell zusammengebastelt habe. Man spart sich also im Endeffekt einfach viel Arbeit, weil das zumindest unter Windows bereits vorgefertigt vorhanden ist.

Rein zum Lernen werd ich jetzt aber meine Lösung fertig machen und beibehalten. Aber wenn ich sowas nochmal brauche, werd ich wohl auf die Lösung von Abt verwenden, weil man sich damit wohl einiges an Arbeit/Zeit spart.

Falls es jemanden interessiert, im deutschen findet man das Ding bei Windows mit "Anmeldeinformationsverwaltung", wenn man sich angucken will wer/was damit Passwörter auf dem PC speichert.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16110

beantworten | zitieren | melden

Solangs nur der Lerneffekt ist, da kannste ja machen was Du willst; je mehr, desto besser fürs Verständnis.
Sobald es produktiv wird, gibts spätestens mit DSGVO auch entsprechende gesetzliche Rahmenbedingungen für die Handhabung Zugangsdaten. Da ist es ratsam, wenn man solche Implementierungen den Profis überlässt :-)
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers