Ich muss meine Anwendung "passwortgeschützt" haben, brauche aber Ratschläge, wo das Passwort sicher gespeichert werden muss.
Wie ich das vorhabe:
Beim ersten Start des Programms werde ich den Benutzer auffordern, ein Passwort zu erstellen. Das Passwort wird in SHA-256 gesalzen und gehackt und dann entweder in der Registry oder in einer Datei gespeichert.
Das Problem:
Wenn ich das gehashte Passwort in der Registry oder einer Datei (oder beiden) abspeichere, wäre es zu einfach, den Schlüssel in der Registry oder der Datei einfach zu löschen und zur Erstellung eines neuen Passworts aufgefordert zu werden ...
Wie kann ich das Hash-Passwort sicher speichern, so dass es schwieriger zu löschen ist?
Ich habe darüber nachgedacht, es in der Registry zu speichern und auch eine Datei mit den Hidden- und Systemattributen zu erstellen, von der man im Falle des Löschens der Registry-Datei lesen kann, aber das scheint albern, da es auch ganz einfach gelöscht werden kann. p>
// Ich hoffe, ich habe diese Frage richtig mit den richtigen Tags gepostet - ich bin neu hier, also bitte geh einfach! ;)
Alles Gute
Chris (Shamballa)
Dies ist im Grunde genommen ein Programming Ethics 101. Wenn Sie Informationen auf dem Computer eines anderen speichern, denken Sie daran, dass der Computer ihre Eigenschaft ist und dass sie das Recht haben, eine Datei oder einen Registrierungsschlüssel darauf zu löschen oder zu ändern. Es ist eine sehr schlechte Idee, es so zu machen, dass sie es nicht können.
Es gibt einen guten Grund, warum Sie es nicht tun können. Was passiert, wenn jemand Dateien anlegt, die Sie nicht löschen oder ändern können? Extrapoliere auf die logische Schlussfolgerung: Was passiert, wenn ein Virus Dateien auf deinem Computer startet, die du nicht löschen oder ändern kannst, und dies in einer Endlosschleife, bis die Festplatte voll ist? Sie wissen wenn es möglich wäre, würde jemand es versuchen.
Wenn Sie ein Programm wünschen, das ein Passwort irgendwo speichert, wo der Benutzer es nicht ändern kann, legen Sie es auf Ihren Server und lassen Sie Ihr Programm über eine Internetverbindung kontaktieren. (Was eine ganz andere Würmer-Dose ist, aber zumindest versucht man nicht, unmögliche Dinge zu tun oder die grundlegenden Eigentumsrechte der Benutzer zu verletzen.)
Sie haben nicht wirklich angegeben, was dieses Passwort schützt. Ich nehme an, dass es verwendet wird, um die von Ihrem Programm erstellten Daten zu schützen.
Ich bin kein Sicherheitsexperte oder Kryptograf, aber wenn die Daten lokal gespeichert werden, ist die Lösung einfach. Speichern Sie das Passwort (oder eher einen Hash des Passworts) und die Daten an derselben Stelle (Datei, Datenbank usw.), die mit separaten Schlüsseln verschlüsselt wurden.
Dies verhindert eine Umgehung durch Löschen von Dateien. Sie würden auch alle Daten löschen. Dies wird alle außer dem entschlossenen Endbenutzer durchkreuzen.
Sie können ein Kennwort für eine Anwendung mithilfe der Windows Crypto API sicher speichern. Es gibt ein Beispiel für die Verwendung in CodeGuru , aber es ist in C ++ geschrieben, nicht Delphi. Der Code ist nicht zu anspruchsvoll, sollte also relativ einfach nach Delphi konvertiert werden.
Eine erweiterte Lösung wäre, den Benutzer vor dem Herunterladen der Anwendung nach dem Kennwort zu fragen und das gehashte Kennwort in die Binärdatei einzubetten. Wenn Sie mehrere Kopien der Anwendung erhalten haben, können Sie den Speicherort der verschlüsselten Datei problemlos ermitteln Wert, und der Code überprüft es, um es zu entfernen.
Das Problem ist, dass Sie durch die Verwendung des Passworts keinen Wert geschaffen haben, d. h. es scheint nur ein Passwort zu sein. Sie sollten das Kennwort als Ausgangspunkt für die Verschlüsselung der Anwendungsdaten verwenden und das Kennwort an die Daten binden. Verliere das Passwort und du verlierst nur die Daten.
Die beste Lösung wäre, sich auf eine externe Quelle zu verlassen, die der Benutzer NICHT steuern kann, um einen Teil des Passworts zu speichern. Ansonsten, egal wo Sie es verstecken, kann es leicht von jemandem mit ein paar kostenlosen Tools und ein wenig Zeit entdeckt werden.
Ich persönlich habe herausgefunden, dass der beste Ort zum Speichern solcher Daten im Freien ist, zusammen mit anderen Daten, auf die die Anwendung häufig zugreift. Beachten Sie, dass ein Risiko für den Benutzer besteht, wenn er die Daten ändern darf.
Wenn Sie Ihr Programm sperren möchten, muss der Schlüssel bereits vorhanden sein, bevor das Programm ausgeführt wird. Auf diese Weise müssen Sie sich nur darum kümmern, wie Sie den Schlüssel erhalten, und da es verschlüsselt ist, wäre es für sie schwieriger, einen zu erstellen, der für Ihr System funktioniert.
Für Ihren anfänglichen Authentifizierungsprozess können Sie einen Teil des Schlüssels auf Ihrem Webserver platzieren und dem Benutzer einen Schlüssel geben, der zum Erstellen der verschlüsselten Datei erforderlich ist. Die Verwendung des Pass-Schlüssels würde sie zu dem Schlüssel auf Ihrem Server führen, und wenn es gültig ist, dann erlauben Sie ihnen, die verschlüsselte Datei zu speichern. Wenn Sie sich Sorgen um eine erneute Aktivierung machen, können Sie die Datei auf Ihrem Webserver löschen, sobald sie aktiviert ist.
Eine andere Möglichkeit wäre, etwas wie OnGuard ( neueste Versionen ), um einen zeitlich begrenzten Schlüssel zu verschlüsseln, den Sie dem Benutzer geben. Wenn die Aktivierung ausgeführt wird, überprüfen Sie, ob der von Ihnen angegebene Schlüssel abgelaufen ist oder nicht, und wenn dies der Fall ist, lassen Sie die Aktivierung nicht zu. Auf diese Weise ist Ihr Aktivierungsschlüssel nur für eine begrenzte Zeit gefährdet.
Verbringe nicht zu viel Zeit damit. Sogar der beste Algorithmus kann mit einigen NOP Anweisungen nach der Bereitstellung der App gepatcht werden.
Es gibt mindestens zwei Möglichkeiten, wie ich Ihre Frage interpretieren kann.
(1) Sie möchten Passwörter speichern, damit sie später zur Anmeldung in einer entfernten Datenbank verwendet werden können.
Diese Antwort auf Passwort-Verschlüsselung in Delphi erklärt den Verschlüsselungsteil.
Auf diese Weise können Sie ein Passwort speichern, so dass es später zur Authentifizierung des Benutzers verwendet werden kann, wenn er sich mit Ihrer Anwendung auf einem Datenbankserver oder etwas anderem anmeldet.
Der Teil "nicht löschen" ist sehr empfindlich für Benutzer; Das würde ich nicht tun.
(2) Sie möchten ein Kennwort speichern, damit ein Benutzer lokal auf Ihre Anwendung zugreifen kann.
Das ist schwieriger, als Sie es im Grunde nicht können.
Der beste Weg besteht darin, einen Hintergrundprozess aufrechtzuerhalten, der die Datei festhält.
Sie kommunizieren mit diesem Prozess, um die Datei zu entsperren, damit Sie das Kennwort überprüfen können.
- Jeroen
Nach Ihrer Beschreibung zu urteilen, verstehen Sie das nicht, wenn Ihre gesamte Sicherheit
ist %Vor%Dann haben Sie überhaupt keine Sicherheit, und es ist nicht Sache des Benutzers, Ihre Passwortdatei zu löschen. Der Benutzer kann einfach Ihre EXE-Datei in einem beliebigen Binäreditor öffnen und den Teil, der die Überprüfung durchführt, nicht herausnehmen:
%Vor%Sie müssen feststellen, dass, obwohl Sie Ihre App kompilieren, es immer noch den gesamten Quellcode enthält, nur in Assembler. Du kannst die Quelle immer noch bearbeiten, es ist nur ein bisschen schwieriger, weil es jetzt in einer anderen Sprache ist.
Wenn Sie also verhindern möchten, dass Nutzer etwas in Ihrer App tun, gibt es nur zwei Möglichkeiten:
Schütze deine App und ihre Dateien. Oder speichern Sie sie auf einem separaten Server, wenn Sie diesen nicht kontrollieren können. Oder machen Sie sie zu einem Dienst, der nur einen festen Satz von Befehlen akzeptiert.
Machen Sie es so, dass die App es nicht überprüft, sondern etwas kritisches mit Passwort verschlüsselt. Sicher, böswillige Benutzer können das Passwort zurücksetzen oder sogar die Entschlüsselungsroutine ganz löschen, aber er muss die Daten immer noch entschlüsseln.
Jede andere Lösung könnte umgangen werden, nur die Zeit und die Fähigkeiten, die es zu umgehen gilt, sind unterschiedlich. Zum Beispiel können Sie einen kritischen Teil des Anwendungscodes verschlüsseln und ihn sofort entschlüsseln (hat das einmal getan). Dann ausführen und verschlüsseln zurück. Ohne das richtige Passwort wird Ihre App niemals ausgeführt.
Aber ein böswilliger Benutzer kann eine separate Kopie der App mit einem bekannten Passwort installieren, Teile des Programms untersuchen, wenn sie entschlüsselt werden, und sie in der unverschlüsselten Quelle zusammenstellen. Sicher, das ist eine Menge Arbeit. Aber es kann in einer endlichen Zeit getan werden.
Ich würde vorschlagen, die Authentifizierungsfunktionen in Windows zu verwenden, insbesondere CredWrite und CredRead . Es wäre auch möglich, die Verschlüsselungsfenster zu verwenden (CryptProtectData / CryptProtectMemory) und dann die Zugangsdaten zu speichern.
BEARBEITEN : Wenn Sie die Header für Delphi benötigen, sind diese im verfügbar Jedi Windows Api-Bibliothek .