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
Wie Inhalte in einer App verschlüsseln?
Paschulke
myCSharp.de - Member



Dabei seit:
Beiträge: 63

Themenstarter:

Wie Inhalte in einer App verschlüsseln?

beantworten | zitieren | melden

Hallo!

Ich möchte einen TOTP Generator für Windows erstellen (im Prinzip genauso wie die Android App "Google Authenticator").
Grundsätzlich habe ich das hinbekommen. Meine Frage ist, wie kann ich die Schlüssel, die ich für die Generierung der Einmalpasswörter benötige, sicher speichern?

Aktuell habe ich es so gelöst, dass ich sie mit AES verschlüsselt in eine Textdatei schreibe.
Aber wie lege ich den Schlüssel für die AES-Verschlüsselung sicher ab? Nach etwas Recherche schien mir der einizig sichere Weg die Vergabe eines Passworts durch den Nutzer selber zu sein. Also vergibt der Nutzer nun beim erstmaligen Start ein Passwort, ich speichere den mit Argon2 verschlüsselten Hashwert des Passworts in einer Textdatei ab und lasse den Benutzer bei jedem Programmstart das Passwort neu eingeben.
Das Passwort muss ich allerdings jeweils im Speicher halten, weil ich es ja für die AES-Verschlüsselung benötige.

Fragen:
1. Ist es ok das Passwort im Speicher zu halten? Ich verwende einen SecureString - aber der ist ja nicht wirklich sicher. Aber irgendwo muss der Key für die Verschlüsselung ja schließlich stehen...
2. Ist die Vorgehensweise sinnvoll? Oder gib es bessere Möglichkeiten?
3. Wie macht es Google bei seiner App? Da muss ich kein Passwort eingeben!?
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15818
Herkunft: BW

beantworten | zitieren | melden

Apps auf Windows (UWP), Android, IOS haben einen isolierten Datenbereich.
D.h. Anwendung A kann gar nicht auf Anwendung B zugreifen und ist daher "by Design" sicher.
Konzeptionell ist also eine Json-Datei in Deinem Anwendungsbereich "sicher".

Mit Hilfe von root Access (zB Android) kann man trotzdem auf diesen Datenbereich zugreifen.
Rooting gilt aber allgemein als Zero Warranty, was prinzipiell dann heisst: nicht mehr in Deinem Einfluss, da Du die Bordmittel verwendet hast.

Gibt aber zB auf Android auch mit Jetpack Security ein Framework, mit dem Du lokale Daten verschlüsseln kannst.
private Nachricht | Beiträge des Benutzers
Paschulke
myCSharp.de - Member



Dabei seit:
Beiträge: 63

Themenstarter:

beantworten | zitieren | melden

Ich bin nicht sicher, ob das richtig rüber kam. Das Programm soll eine Windows 10 Desktop Anwendung sein. Deine Antwort bringt mich leider nicht wirklich weiter...
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Paschulke am .
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15818
Herkunft: BW

beantworten | zitieren | melden

Auf Windows kannst Du sicher Credentials im Windows Credential Manager hinterlegen.
Das verwendet zB. auch die Office Suite für Credentials.
Zitat
Deine Antwort bringt mich leider nicht wirklich weiter...
Ich gelobe mir Besserung.....
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4026

beantworten | zitieren | melden

Da sollte dir z.B. das NuGet Paket CredentialManagement (ein C# Wrapper für den "Windows Tresor") weiterhelfen.
private Nachricht | Beiträge des Benutzers
Paschulke
myCSharp.de - Member



Dabei seit:
Beiträge: 63

Themenstarter:

beantworten | zitieren | melden

OK, vielen Dank euch beiden! Das sieht gut aus. :-)

Allerdings hatte ich meine Anwendung mit .NET Core erstellt. Das NuGet Paket sieht älter aus. Kennt jemand ein Paket für .NET Core?
Ansonsten muss ich mir den Quellcode herunterladen und versuchen ihn auf .NET Core bzw. Standard zu konvertieren...
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15818
Herkunft: BW

beantworten | zitieren | melden

Windows Tresor ist der deutsche Name vom Windows Credential Manager.
Zitat
Ansonsten muss ich mir den Quellcode herunterladen und versuchen ihn auf .NET Core bzw. Standard zu konvertieren...
Auf den ersten Blick sollte das kein Problem sein, das entsprechend zu migrieren.
An der Windows API selbst hat sich nichts geändert.
private Nachricht | Beiträge des Benutzers
Paschulke
myCSharp.de - Member



Dabei seit:
Beiträge: 63

Themenstarter:

beantworten | zitieren | melden

Nochmal interessehalber:
- Wäre der in meinem ersten Kommentar beschriebene Ansatz sicher?
- Und habe ich es richtig verstanden, dass man Passwörter im Speicher halten kann, weil man davon ausgeht, dass der Benutzer ein grundsätzliches Problem hat, wenn jemand den Speicher analysieren kann?
private Nachricht | Beiträge des Benutzers
Papst
myCSharp.de - Experte



Dabei seit:
Beiträge: 357
Herkunft: Kassel

beantworten | zitieren | melden

Wenn du - wie im ersten Kommentar - selber eine Datei verschlüsselst, was machst du mit dem Schlüssel für die Datei?
Das verschiebt dein Problem nur ein Stückchen weiter.

Der Credential Manager ist an das Benutzerkonto des angemeldeten Benutzers gebunden. Das verschiebt das Problem natürlich auch nur, dafür aber an die Anmeldung des Benutzers.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15818
Herkunft: BW

beantworten | zitieren | melden

Zitat von Paschulke
Und habe ich es richtig verstanden, dass man Passwörter im Speicher halten kann, weil man davon ausgeht, dass der Benutzer ein grundsätzliches Problem hat, wenn jemand den Speicher analysieren kann?

Das bezieht sich nur auf einen Isolated Storage, den Du auf Windows nur mit UWP hast.

Siehe Isolated Storage
private Nachricht | Beiträge des Benutzers
Paschulke
myCSharp.de - Member



Dabei seit:
Beiträge: 63

Themenstarter:

beantworten | zitieren | melden

Zitat von Papst
Wenn du - wie im ersten Kommentar - selber eine Datei verschlüsselst, was machst du mit dem Schlüssel für die Datei?
Das verschiebt dein Problem nur ein Stückchen weiter.

Aber wie löst man dann so eine Aufgabe sinnvoll?

Ich lasse ja genau deshalb den Schlüssel vom Benutzer eingeben (sein Passwort). Und nach allem was ich gelesen habe, sollte eine Passwortverschlüsselung z. B. mit Argon2 nicht mehr entschlüsselbar sein (mit aktuellen Mitteln).
Und ob ich es selber verschlüsselt ablege, oder von Windows verwalten lasse, ist dann theoretisch egal. Die Credential Manager-Lösung hätte allerdings einige Vorteile, weshalb ich diese favorisieren würde.

--

Und wegen des Passworts im Speicher: Gibt es eine empfohlene Vorgehensweise? Irgendwie muss ich es ja zwischenzeitlich halten.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15818
Herkunft: BW

beantworten | zitieren | melden

Zitat von Paschulke
Aber wie löst man dann so eine Aufgabe sinnvoll?
Eine Lösung wurde Dir ja genannt.

Ansonsten ist eine potentielle Lösung auch immer abhängig von der Umgebung.
Unter Windows ist eine entsprechende User Identity teil des gesamten Rechtesystems.
Windows Security - Windows Hello

Was Du halt machst ist das Rad entsprechend neu zu erfinden statt Bordmittel zu nutzen.
Ich würde wann immer möglich einfach Windows die Identitätsverwaltung überlassen.
Machen (Gott sei dank) immer mehr Applikationen.
Zitat von Paschulke
Und ob ich es selber verschlüsselt ablege, oder von Windows verwalten lasse, ist dann theoretisch egal.

Nein ist es nicht.

Wenn jemand an ein verschlüsseltes Passwort kommt, ist das immer auch ein Indiz auf ein solches.
Das ist der Baustein jeder Rainbow Table.

Daher: verwende wann immer möglich ein Credential Store.
Zitat von Paschulke
Gibt es eine empfohlene Vorgehensweise?
Gar nicht (nutze Bordmittel!) oder zu kurz wie möglich halten.
private Nachricht | Beiträge des Benutzers