Wie speichere ich Informationen in meiner ausführbaren Datei in .Net

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.

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

BEARBEITEN: Das Programm verarbeitet Kreditkarteninformationen, so dass die Möglichkeit besteht, die Konfiguration in irgendeiner Weise zu ändern, was ein potenzielles Sicherheitsrisiko darstellen könnte. 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 erhält.

Die Konfiguration muss weiterhin editierbar sein, daher ist das Erstellen einer individuellen Kopie für jeden Kunden keine Option.

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

    
Mykroft 29.08.2008, 19:27
quelle

4 Antworten

11

Eine bessere Lösung ist, das MD5 in der Konfigurationsdatei zu speichern. 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.

%Vor%

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

Denken Sie daran, dass dies eine ziemlich schwache Lösung ist (genau wie die, die Sie vorschlagen), da sie leicht in Ihr Programm eindringen können, um den Schlüssel zu finden oder wo das 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 die Informationen wirklich in Ihrer ausführbaren Datei speichern möchten (was ich abraten würde), können Sie einfach versuchen, sie am Ende der EXE anzuhängen. Das ist normalerweise sicher. Das Ändern ausführbarer Programme ist ein virusartiges Verhalten, und die meisten Betriebssystem-Sicherheitseinstellungen werden versuchen, Sie ebenfalls 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: Es ist mir egal, ob Sie Asymmetrische Verschlüsselung, RSA oder Quantum Kryptografie verwenden, wenn Sie Ihre Schlüssel auf dem Computer des Benutzers speichern (was Sie müssen ) Wenn Sie nicht alles über einen Webservice weiterleiten, kann der Benutzer Ihre Schlüssel finden, auch wenn dies bedeutet, dass die Register auf der CPU zur Laufzeit überprüft werden müssen! 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 erzeugt und irgendwo "geheim" in der Registry 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 die 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.

AKTUALISIERUNG: Bei einem Kreditkartensystem sollten Sie eine echte Sicherheit in Erwägung ziehen. Sie sollten die Dienste eines Sicherheits- und Kryptografieberaters beibehalten. Weitere Informationen müssen ausgetauscht werden. Sie müssen Ihre spezifischen Bedürfnisse und Risiken analysieren.

Wenn Sie Sicherheit mit .NET wünschen, müssen Sie zuerst mit einem wirklich guten .NET-Obfuscator starten ( einfach Google es ). 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.

    
Jim McKeeth 29.08.2008, 19:34
quelle
1
Aus reiner Neugier, was ist dein Grund dafür, die Datei niemals laden zu wollen, wenn sie geändert wurde?

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

Bearbeiten

Ich habe gerade gelesen, dass dies ein Kreditkarten-Info-Programm ist. Das ist eine sehr interessante Herausforderung.

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

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

    
Mark Biek 29.08.2008 19:34
quelle
1

Ich würde vorschlagen, dass Sie eine asymmetrische Schlüsselverschlüsselung verwenden, um Ihre Konfigurationsdatei, unabhängig davon, wo sie gespeichert ist, innerhalb der ausführbaren Datei zu verschlüsseln.

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

Zur Erklärung finden Sie Public-Key-Kryptographie auf Wikipedia

Speichern Sie den "reading" Schlüssel in Ihrer ausführbaren Datei und behalten Sie sich den "schreibenden" Schlüssel vor. Niemand außer Ihnen kann die Konfiguration ändern.

Dies hat die Vorteile von:

  • Niemand kann die Konfiguration ändern, es sei denn, sie haben den Schlüssel "write", weil jede Änderung sie komplett korrumpiert , selbst wenn sie den Schlüssel "reading" kennen, würde es ewig dauern, den anderen zu berechnen Schlüssel.
  • Änderungsgarantie.
  • Es ist nicht schwer - heutzutage gibt es viele Bibliotheken. Es gibt auch viele Schlüsselgenerierungsprogramme, die wirklich, wirklich lange Schlüssel erzeugen können.

Recherchieren Sie jedoch, wie Sie sie richtig implementieren können.

    
chakrit 29.08.2008 19:52
quelle
-2

mach einfach eine const-Zeichenkette, die den md5-Hash enthält und kompiliere sie in deine App ... deine App kann dann nur auf diese const-Zeichenkette verweisen, wenn sie die Konfigurationsdatei validiert

    
Joel Martinez 29.08.2008 19:30
quelle

Tags und Links