2009-01-14 10 views
17

Ich dachte daran, ein kleines Werkzeug zu machen. Es ist nicht wichtig, was das Werkzeug tun wird. Wichtig ist, dass das Tool einige vertrauliche Informationen auf der Festplatte des Benutzers speichern muss. EDIT: Die Informationen, die gespeichert werden, sind Informationen des Benutzers - ich versuche nicht, meine eigenen Inhalte zu schützen, die ich mit der App vertreibe.Gibt es unter Windows eine Art sicheren lokalen Speicher?

Ich verstehe, dass ich diese Informationen verschlüsseln muss. Aber wo kann ich das Verschlüsselungspasswort sicher speichern? Es ist eine Art unendliche Rekursion ...

Also, gibt es eine Möglichkeit, Informationen über Windows zu verschlüsseln und Fenster sicher verwalten die Passwörter? Wenn ich Windows sage, meine ich Windows XP SP2 oder höher.

Ich sollte auch beachten, dass Benutzer auf dem gleichen System keinen Zugriff auf andere Benutzerinformationen haben dürfen (auch wenn sie beide meine Anwendung ausführen).

Ich suche sowohl - .NET 2.0 (C#) - und native (C/C++) Lösungen für dieses Problem.

Antwort

20

gibt es eine möglichkeit, informationen über windows zu verschlüsseln und windows sicher zu verwalten die passwörter?

CryptProtectData: http://msdn.microsoft.com/en-us/library/windows/desktop/aa380261(v=vs.85).aspx

von .NET: http://msdn.microsoft.com/en-us/library/aa302402.aspx

Historisch gesehen, geschützten Speicher (erhältlich in XP, read-only in vista +): http://msdn.microsoft.com/en-us/library/bb432403%28VS.85%29.aspx

+3

Verwenden Sie für .NET 2.0+ die System.Security.Cryptography.ProtectedData-Klasse anstelle von @ bobince's 2. Verknüpfung. – devstuff

3

Sie können die native Verschlüsselungsfunktion verwenden. Legen Sie das Verschlüsselungsattribut für Ihren Ordner oder Ihre Datei fest (klicken Sie auf der Eigenschaftenseite auf die Schaltfläche "Erweitert"). Dann können Sie die Benutzer festlegen, die auf die Datei zugreifen können (standardmäßig enthält dies nur den Ersteller der Datei). Der große Vorteil dieser Lösung besteht darin, dass sie aus der Sicht der Anwendung und des Anwenders völlig transparent ist.

Programmgesteuert ausführen: Rufen Sie unter Verwendung der Win32-API EncryptFile() in dem Verzeichnis auf, in dem Sie Ihre vertraulichen Benutzerdaten speichern möchten. Ab sofort sind alle neu erstellten Dateien in diesem Verzeichnis verschlüsselt und nur für den Ersteller lesbar (das wäre der aktuelle Nutzer Ihrer App). Alternativ können Sie das Flag FILE_ATTRIBUTE_ENCRYPTED für einzelne Dateien zum Zeitpunkt der Erstellung verwenden. Sie können die Verschlüsselungsinformationen im Explorer auf der Eigenschaftenseite der Datei überprüfen und sicherstellen, dass von der App erstellte Dateien korrekt verschlüsselt und auf ihre jeweiligen Benutzer beschränkt sind. Es gibt kein Passwort zum Speichern oder Verwenden, alles ist transparent.

Wenn Sie Daten von allen Benutzern ausblenden möchten, können Sie einen speziellen anwendungsspezifischen Benutzer erstellen und ihn von Ihrer App aus annehmen. Dies ist zusammen mit ACLs die gesegnete Technik unter Windows für Systemdienste.

+0

Kann ich es aus Code setzen? Wie von .NET C# oder native C++ - Anwendung? – Paulius

+0

Das hilft jedoch nicht bei der Verteilung des Codes/Tools an andere ... – xan

+0

Nun, die Informationen müssen zuerst vom Benutzer eingegeben werden, und dann muss meine App sie sicher speichern. Also, wenn ich solche Dateien in meiner App erstellen kann - könnte es funktionieren. – Paulius

2

Sie können sich den isolierten Speicher ansehen, bei dem Einstellungen und andere Daten automatisch für einzelne Anwendungsdaten gespeichert werden. Siehe eine example und MSDN.

Dies ist eine Alternative zum Speichern normaler Einstellungen in der Registrierung, eine bessere in vielen Fällen ... Ich bin mir nicht sicher, wie die Daten in Datei gespeichert werden, so dass Sie überprüfen müssten, würden Sie nicht Ich möchte, dass es für andere Benutzer zugänglich ist, sogar verschlüsselt. Aus dem Speicher nur die App. das erstellte Speicher kann es öffnen - aber das muss überprüft werden.

Edit:

Aus dem Gedächtnis, als ich zuletzt benutzten, ein guter Ansatz ist es, eine „Einstellung“ Klasse zu schreiben, die die Einstellungen alle usw. in Ihrer Anwendung behandelt. Diese Klasse hat dann das Äquivalent der Serialize- und DeSerialize-Methoden, mit denen sie alle ihre Daten in eine IsolatedStorage-Datei schreiben oder sie wieder laden kann. Der zusätzliche Vorteil der Implementierung auf diese Weise besteht darin, dass Sie Attribute verwenden können, um Bits der Quelle zu markieren, und dann ein Eigenschaftsraster verwenden können, damit Sie schnell die Einstellungen der Benutzer bearbeiten können (das Eigenschaftenraster ändert Klasseneigenschaften bei) Laufzeit mit Reflektion).

+0

Ich lese jetzt die Dokumente. Das sieht vielversprechend aus ... – Paulius

+4

Von MSDN: "Verwenden Sie keinen isolierten Speicher zum Speichern von geheimen Schlüsseln mit hohem Wert, z. B. unverschlüsselte Schlüssel oder Kennwörter, da isolierter Speicher nicht vor sehr vertrauenswürdigem Code, nicht verwaltetem Code oder vertrauenswürdigen Benutzern geschützt ist der Computer." – Casebash

+0

@Casebash Danke für das Update. – xan

-5

Erm Hash das Passwort? Sie müssen das echte Geschäft nicht irgendwo auf der Maschine speichern nur ein Hash-Passwort (möglicherweise auch gesalzen). Wenn der Benutzer dann sein Passwort eingibt, führen Sie denselben Vorgang aus und vergleichen ihn mit dem Hash-Wert, den Sie auf dem Datenträger gespeichert haben.

+0

Das ist der Punkt - ich möchte nicht einmal den Benutzer nach dem Passwort fragen. Der Punkt meiner App ist, dass, wenn der Benutzer sich bereits in Windows angemeldet hat - dann ist er, wer er sagt, er ist.Also würde das nicht für mich funktionieren. – Paulius

+0

Wenn der Benutzer bereits angemeldet ist, warum verwenden Sie dann überhaupt ein Passwort? – liggett78

+0

Da die Informationen, die in einer externen Datei (oder was auch immer) gespeichert werden, nicht von einem anderen Benutzer zugänglich sein dürfen (wenn sich jemand anderes bei seinem eigenen Windows-Konto anmeldet). – Paulius

0

Ich empfehle Ihnen, den Enterprise Library Cryptography Application Block zu betrachten. Überprüfen Sie diese blog post. Windows verfügt über eine integrierte Data Protection API zum Verschlüsseln von Daten, aber der Crypto Application Block macht es einfacher.

-4

Äh, was du bist zu erreichen, ist genau das, was DRM zu erreichen versucht. Verschlüsseln Sie etwas und geben Sie dem Benutzer dann die Schlüssel (jedoch verschleiert) und die Verschlüsselung. Sie haben es mit DVDs gemacht. Sie haben es mit Blu-Ray gemacht. Sie haben es mit iTunes gemacht.

Was Sie vorhaben zu tun, wird niemals sicher sein. Ihr durchschnittlicher Laie wird es wahrscheinlich nicht herausfinden, aber jeder ausreichend motivierte Angreifer wird es herausfinden und die Schlüssel, den Algorithmus und die Daten entschlüsseln.

Wenn Sie nur Benutzerdaten verschlüsseln, fragen Sie den Benutzer nach seinem Passwort. Wenn Sie versuchen, Ihre internen Daten vor dem Benutzer zu schützen, der die Anwendung ausführt, sind Sie S.O.L.

+0

Was ist S.O.L.? Jedenfalls versuche ich nicht dasselbe wie DRM zu erreichen. Ich versuche nicht, MEINE Dateien zu verschlüsseln, die ich später mit der App verteilen würde - ich brauche eine Möglichkeit, USER Informationen zu verschlüsseln, die HE/SHE in meine APP eingeben wird (die Informationen müssen für die spätere Verwendung in meinem gespeichert werden) App). – Paulius

+0

S.O.L. = "S ** t Outta Luck" –

3

Sie sollten DPAPI für diesen Zweck verwenden. Es verschlüsselt Ihre Daten mit einem speziellen (internen) symmetrischen Schlüssel, der auf Benutzerbasis ist. Sie müssen in diesem Fall nicht einmal nach Passwörtern fragen, da verschiedenen Benutzern auf dem System unterschiedliche Schlüssel zugewiesen werden.

Der Nachteil könnte sein, dass Sie die Daten nicht wiederherstellen können, wenn der Benutzer gelöscht/Windows neu installiert wird (ich glaube, dass dies der Fall ist, nicht ganz sicher, obwohl). In diesem Fall verschlüsseln Sie die Daten mit einem "selbst generierten" Schlüssel, der vom Passwort abgeleitet ist, und speichern Sie das Passwort in der Registry/Datei verschlüsselt mit DPAPI.

+0

Link zu den Dokumenten für .NET 2.0 und höher: http://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata.aspx – liggett78

+0

Nun, während Die Daten sind empfindlich, ich kann sicher davon ausgehen, dass der Benutzer die Daten im Falle einer Windows-Neuinstallation erneut eingeben kann. Schließlich erhalte ich die Daten an erster Stelle - der Benutzer gibt sie ein, und dann erinnert sich meine App einfach automatisch daran. – Paulius