2012-05-15 8 views
9

Kann jemand meine Gedanken ruhen lassen und sehen, ob dieses Setup bestätigt, dass eine Datei von mir stammt. Eine Idee davon, wie sicher das ist, wäre groß und mögliche Angriffsvektoren.Sichere DSA-Signatur

  1. Erstellen Sie einen öffentlichen und privaten Schlüssel mit DSACryptoServiceProvider.
  2. hinzufügen öffentlichen Schlüssel als Anwendungsressourcen
  3. Update erstellen
  4. dsa Hash-Update privaten Schlüssel
  5. Senden Hash und Update-Anwendung (Presume diese können abgefangen werden/geändert) Get
  6. Überprüfen Hash Korrigieren Sie den öffentlichen Schlüssel.
  7. Wenn anwenden prüft Update

Das Update eine exe und wird so ausgeführt werden, möchte ich sicherstellen, dass es nicht der ausgeführt wird, wenn jemand ersetzt oder Stampfer mit ihm.

BEARBEITEN: Punkt 6 wurde aktualisiert, da der öffentliche Schlüssel keinen Hash erzeugt, sondern nur überprüft. Ich denke, es ist dieser Teil, mit dem ich mit der Sicherheit von.

+2

Das ist genau der richtige Algorithmus, außer dass Sie nicht mit Ihrem privaten Schlüssel _hash_; Sie generieren einen Hash und dann den Hash mit Ihrem privaten Schlüssel _encrypt. Der Empfänger verwendet Ihren _public_-Schlüssel, um den Hash zu entschlüsseln und zu verifizieren. Ich nehme auch an, dass sich Ihr privater Schlüssel auf einem isolierten Medium befindet (einem USB-Schlüssel oder einem nicht vernetzten Computer). :-) Ihr privater Schlüssel muss geheim gehalten werden, aber alle anderen Komponenten (das Update, der Hash und Ihr öffentlicher Schlüssel) müssen nicht sicher gehalten werden. –

+0

Danke Adam, nur ein paar Punkte, die ich vermisse.Wie bekomme ich den Hash von DSACryptoProvider ohne den privaten Schlüssel? Ich dachte, Hash = DSACryptoServiceProvider.fromxmlstring (privater Schlüssel) .signdata (fileToGetHashFrom) - Zweiter Punkt. Ich dachte nicht, ich könnte Daten mit DSA verschlüsseln, sollte ich etwas anderes verwenden? Verschlüsseln Sie Daten normalerweise nicht mit einem öffentlichen Schlüssel und entschlüsseln Sie sie nicht mit einem privaten Schlüssel. Mein Schlüssel ist in diesem Fall falsch herum? Sorry, wenn ich hier blöd bin ;-) – Oli

+2

@Oli das Erstellen von digitalen Signaturen wird oft als ein 2-stufiger Prozess beschrieben, bestehend aus 1) Erzeugen eines Hashes der zu signierenden Daten, dann 2) Transformieren des Hashes * mittels * privater Schlüssel, so dass er mit dem öffentlichen Schlüssel verifiziert werden kann und nicht gefälscht werden kann. Die einseitige Art des Generieren/Verifizieren-Prozesses weist Ähnlichkeiten mit der Verschlüsselung/Entschlüsselung auf, wobei nur die öffentlichen und privaten Schlüssel "in umgekehrter Richtung" verwendet werden. 'DSACryptoServiceProvider' wird sich um all diese Details genauso kümmern, wie Sie es kommentiert haben, aber ich denke, Adam ist der Punkt, dass der private Schlüssel selbst nicht zum Generieren des Hashs verwendet wird. – shambulator

Antwort

1

Ihr Ansatz sieht gut aus. Die Frage bleibt, wie sicher ist Ihre Anwendung auf dem Client. Besteht die Möglichkeit, dass jemand die ausführbare Datei manipulieren könnte? Vielleicht den öffentlichen Schlüssel in der Anwendungsressource wechseln?

Es wird hier theoretisch, aber ich würde vorschlagen, eine kleine Änderung zu Schritt 6: Seien Sie konkret, welche öffentlichen Schlüssel Sie verwenden möchten. Wenn ein Angreifer den Schlüssel in der Anwendungsressource wechseln könnte, könnte er ein geändertes Paket mit einem korrekten Hash für einen anderen privaten Schlüssel senden. Dies kann nur ein geringfügiges Problem sein, da der Angreifer Ihre Software bereits geändert hat. Aber wenn er nur die Anwendungsressource und sonst nichts ersetzen könnte, dann könnte seine Anwendung sich mit seinem bösartigen Code aktualisieren.