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.
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