2008-08-29 7 views
8

Ich möchte eine Konfigurationsdatei an meine ausführbare Datei binden. Ich möchte dies tun, indem Sie einen MD5-Hash der Datei in der ausführbaren Datei speichern. Dies sollte jeden außer der ausführbaren Datei daran hindern, die Datei zu ändern.Wie speichere ich Informationen in meiner ausführbaren Datei in. NET

Im Wesentlichen, wenn jemand diese Datei außerhalb des Programms ändert, sollte das Programm es nicht erneut laden.

EDIT: Das Programm verarbeitet Kreditkarteninformationen, so dass die Konfiguration in irgendeiner Weise geändert werden kann, könnte ein potenzielles Sicherheitsrisiko darstellen. Diese Software wird an eine große Anzahl von Kunden verteilt. Im Idealfall sollte der Client eine Konfiguration haben, die direkt an die ausführbare Datei gebunden ist. Dies wird hoffentlich verhindern, dass ein Hacker eine gefälschte Konfiguration an Ort und Stelle bekommt.

Die Konfiguration muss noch bearbeitet werden, daher ist das Erstellen einer individuellen Kopie für jeden Kunden keine Option.


Es ist wichtig, dass diese dynamisch sein. Damit kann ich den Hash an die Konfigurationsdatei binden, wenn sich die Konfiguration ändert.

Antwort

11

Eine bessere Lösung ist es, die MD5 zu speichern in der Konfigurationsdatei. Aber anstelle der MD5, die nur aus der Konfigurationsdatei besteht, sollte auch ein geheimer "Schlüssel" -Wert, wie eine feste GUID, in der MD5 enthalten sein.

write(MD5(SecretKey + ConfigFileText)); 

Dann entfernen Sie einfach das MD5 und rehash die Datei (einschließlich Ihres geheimen Schlüssels). Wenn die MD5's gleich sind, dann hat es niemand modifiziert. Dies verhindert, dass jemand es ändert und die MD5 erneut anwendet, da sie Ihren geheimen Schlüssel nicht kennen.

Denken Sie daran, dies ist eine ziemlich schwache Lösung (wie die, die Sie vorschlagen), wie sie leicht in Ihr Programm verfolgen könnten, um den Schlüssel zu finden oder wo der MD5 gespeichert ist.

Eine bessere Lösung wäre, ein öffentliches Schlüsselsystem zu verwenden und die Konfigurationsdatei zu signieren. Dies ist wiederum schwach, da dies erfordert, dass der private Schlüssel auf seiner lokalen Maschine gespeichert wird. So ziemlich alles, was auf ihrem lokalen PC enthalten ist, kann mit genügend Aufwand umgangen werden.

Wenn Sie wirklich die Informationen in Ihrer ausführbaren Datei speichern möchten (was ich entmutigen würde), dann können Sie einfach versuchen, es am Ende der EXE anzuhängen. Das ist normalerweise sicher. Ändern von ausführbaren Programmen ist Virus wie Verhalten und die meisten Betriebssystem-Sicherheit wird versuchen, Sie auch zu stoppen. Wenn sich Ihr Programm im Verzeichnis Programme befindet und sich Ihre Konfigurationsdatei im Verzeichnis Anwendungsdaten befindet und der Benutzer als Nicht-Administrator (in XP oder Vista) angemeldet ist, können Sie die EXE nicht aktualisieren.

Update: ist mir egal, wenn Sie Asymmetrische Verschlüsselung, RSA oder Quantenkryptographie verwenden, wenn Sie Ihre Schlüssel Speicherung auf dem Computer des Benutzers (die Sie müssen tun, wenn Sie Route alles über einen Web Service), dann kann der Benutzer Ihre Schlüssel finden, auch wenn es bedeutet, die Register auf der CPU zur Laufzeit zu überprüfen! Sie kaufen nur ein mäßiges Maß an Sicherheit, also bleiben Sie bei etwas, das einfach ist. Um eine Änderung zu verhindern, ist die von mir vorgeschlagene Lösung die beste. Um das Lesen zu verhindern, verschlüsseln Sie es, und wenn Sie Ihren Schlüssel lokal speichern, verwenden Sie AES Rijndael.

Update: Die FixedGUID/SecretKey könnte alternativ zur Installationszeit generiert und irgendwo "geheim" in der Registrierung gespeichert werden. Oder Sie könnten es jedes Mal generieren, wenn Sie es aus der Hardwarekonfiguration verwenden. Dann wirst du komplizierter. Wie Sie dies tun möchten, um moderate Hardware-Änderungen zu ermöglichen, wäre es, 6 verschiedene Signaturen zu nehmen und Ihre Konfigurationsdatei 6 Mal zu hashen - einmal mit jedem. Kombinieren Sie jede mit einem zweiten geheimen Wert, wie der oben erwähnte GUID (entweder global oder bei der Installation generiert). Wenn Sie dann überprüfen, dass Sie jeden Hash einzeln überprüfen. Solange sie 3 von 6 haben (oder was auch immer Ihre Toleranz ist), dann akzeptieren Sie es. Wenn Sie es das nächste Mal schreiben, hashen Sie es mit der neuen Hardware-Konfiguration. Dadurch können sie im Laufe der Zeit langsam Hardware austauschen und ein völlig neues System erhalten. . . Vielleicht ist das eine Schwäche. Es kommt alles auf Ihre Toleranz an. Es gibt Variationen basierend auf engeren Toleranzen.

UPDATE: Für ein Kreditkartensystem möchten Sie vielleicht einige echte Sicherheit in Betracht ziehen. Sie sollten die Dienste eines Sicherheits- und Kryptografieberaters behalten. Weitere Informationen müssen ausgetauscht werden. Sie müssen Ihre spezifischen Bedürfnisse und Risiken analysieren.

Wenn Sie Sicherheit mit .NET wollen, müssen Sie zuerst mit einem wirklich guten .NET Obfuscator starten (just Google it). Eine .NET Assembly ist viel einfacher zu zerlegen und auf den Quellcode zuzugreifen und all Ihre Geheimnisse zu lesen. Nicht wie eine kaputte Platte klingen, aber alles, was von der Sicherheit des Systems Ihres Benutzers abhängt, ist von Anfang an grundlegend fehlerhaft.

+0

Nur eine kleine Anmerkung, selbst wenn in C++ geschrieben, wenn Sie das Geheimnis senden/speichern, riskieren Sie, dass es gestohlen wird (Dies ist der Schlüssel hier). Der einzige todsichere Weg, angemessene Sicherheit zu erreichen, ist, niemals das Geheimnis zu senden. Wahrscheinlich werden Sie eine zweiteilige Verschlüsselung benötigen, bei der der Benutzer und Ihre eigenen privaten Schlüssel verwendet werden. Wie Jim sagte, brauchen Sie hier einen richtigen Sicherheitsanalytiker und professionellen Rat. – Gregory

-2

nur eine const String machen, die den MD5-Hash hält und kompilieren Sie es in Ihre App ... Ihre Anwendung kann dann auf diese const string beziehen sich nur, wenn Sie die Datei Konfiguration Validierung

1

Aus reiner Neugier, was ist dein Argument dafür, dass du die Datei nie laden willst, wenn sie geändert wurde?

Warum nicht einfach alle Konfigurationsinformationen in der ausführbaren Datei kompiliert? Warum sollte man sich überhaupt mit einer externen Datei beschäftigen?

bearbeiten

ich deine Bearbeitung über dieses Programm lesen nur eine Kreditkartendaten zu sein. Das ist eine sehr interessante Herausforderung.

Ich würde denken, für diese Sicherheitsstufe wäre eine ziemlich große Verschlüsselung notwendig, aber ich weiß nichts darüber, wie man solche Dinge so handhaben kann, dass die kryptografischen Geheimnisse nicht einfach extrahiert werden können aus der ausführbaren Datei.

Ist die Authentifizierung gegen eine Art von Online-Quelle eine Möglichkeit?

1

Ich würde vorschlagen, Sie verwenden eine asymmetrische Schlüsselverschlüsselung, um Ihre Konfigurationsdatei, wo auch immer sie gespeichert sind, innerhalb der ausführbaren Datei zu verschlüsseln oder nicht.

Wenn ich mich richtig erinnere, ist RSA eine der Varianten.

Für die Erklärung dafür finden Public-key cryptography auf

Wikipedia

Shop die „Lesen“ Schlüssel in die ausführbare Datei und halten Sie die „Schreiben“ Schlüssel an sich selbst. Niemand außer Ihnen kann die Konfiguration ändern.

Dies hat folgende Vorteile:

  • Niemand kann die Konfiguration ändern, wenn sie die „Schreiben“ Schlüssel haben, weil jede Änderung wird korrupt es ganz, auch wenn sie das „Lesen“ Schlüssel kennen es würde ewig dauern, den anderen Schlüssel zu berechnen.
  • Änderungsgarantie.
  • Es ist nicht schwer - es gibt heutzutage viele Bibliotheken zur Verfügung. Es gibt auch viele Schlüsselgenerierungsprogramme, die wirklich, wirklich lange Schlüssel erzeugen können.

Nehmen Sie einige Forschung darüber, wie Sie sie richtig implementieren.

Verwandte Themen