Frage

So übernehmen Sie zwei Clients haben, C1 und C2, jeder Kunde hat eine GUID mit ihr verbunden sind.

Wie wollen Sie, wenn Sie eine Nachricht auf C2 erhalten, dass angeblich kommt von C1 (durch die GUID Überprüfung und zu sehen, dass es die GUID von C1 entspricht), aber da die Nachricht nicht garantiert ist gekommen, von C1 (C3 könnte nur die Nachricht gesendet hat, die GUID von C1 im Message-Header gesendet wird), dass eine Überprüfung sein muss, dass die Nachricht von C1 tatsächlich kam.

Ich habe geschaut, in der Verwendung der asymmetrische Verschlüsselung (RSA) C1 bis eine Nachricht senden, die von [C1.GUID; RSAEncrypt(C2.PUBLIC_KEY, C1.GUID); MESSAGE] besteht, und dann lassen C2 tun grundsätzlich einen Scheck wie dieser (Python Pseudo-Code):

message.GUID == RSADecrypt(C2.PRIVATE_KEY, message.ENCRYPTED_GUID)

Ist das ein gangbarer Weg? Oder gibt es einen anderen klugen / offensichtlichen Weg, um den Absender eine Nachricht zu überprüfen?

War es hilfreich?

Lösung

Assymmetric Algorithmen sind für solche Zwecke erfunden worden, dass die Art und Weise digitale Signaturen Arbeit ist.

Allerdings hat Ihr Ansatz einige Probleme. Wer mit dem öffentlichen Schlüssel des Empfängers fälschen könnte die Unterschrift. Auch dann, wenn die Signatur nicht ändern! Jedes Abfangen der Nachrichten können gefälschten ein gültiger Absender zu sein. Der Zweck assymetric Verschlüsselung ist es, diese Probleme mit Schlüsselaustausch zu besiegen, gibt es das Konzept der digitalen Signatur, die im Grunde ist eine asymmetrisch verschlüsselte Hash der Nachricht, die Sie werfen um.

Für RSA, müssen Sie ein wenig mehr tun, um eine digitale Signatur aus dem Basis-Algorithmus zu erstellen, siehe Wikipedia für weitere Informationen: http://en.wikipedia.org/wiki/RSA#Signing_messages

Ich würde nur einen digitalen Signatur-Algorithmus aus einer Bibliothek verwenden. Erste Such Umdrehungen google mit diesem für Python:

http://www.example-code.com/python/pythonrsa.asp

http://www.chilkatsoft.com/dsa-python.asp

Andere Tipps

Das Problem bei dieser Methode ist, dass jede Maschine dann die GUID und erfassen könnte rsa schlüsselten-guid und gibt ihnen nicht genau das gleiche. Sie haben wirklich keine eindeutige Challenge / Response-Kriterien erstellt, die nur von dem empfangenden Client erahnt werden kann. Was würden Sie etwas wäre benötigen, die absolut einzigartig ist und nicht einfach durch einen Blick auf übergebenen Parameter erhalten werden kann. Vielleicht so etwas wie:

[ClientName; RSA-ENCRYPTED(GUID+Timestamp); MESSAGE]

Bei diesem Verfahren würde die RSA-Verschlüsselung erfolgen Client2 öffentlichen Schlüssel, so dass nur Client2 private Schlüssel es entsperren könnten. Mit Hilfe der Client, Client2 könnte die erwartete GUID aus einer Datenquelle abrufen, und dann paßt die zurück GUID gegen die in der Verschlüsselung. Ich enthalten die Verwendung eines Zeitstempels als Salz, so dass die verschlüsselte Zeichenfolge jedes Mal anders kommt. Es ist als sehr schwach, um einen Zeitstempel als Randomisierung für ein Salz zu verwenden, aber es erhält den Punkt herüber. Andere sicherer / random Algorithmen implementiert werden.

Jede Nachricht zwischen einem Client und dem Server in der Lage, Spionage neue Nachrichten zu schmieden, hat Kunden GUID nie ändern, noch RSA-ENCRYPTED-GUID.

Betrachten Sie auf diese Nachricht Modell vermittlungs. [GUID; ENCRYPTED_CONTENT_CHECKSUM; CONTENT]

Checksum(message.CONTENT) == 
    RSADescrypt(C1.PUBLIC_KEY, message.ENCRYPTED_CONTENT_CHECKSUM)

Noch jemand Nachrichten Spionage vorher gesendeten Nachrichten Erneut senden kann.

öffentliche und private Schlüssel sind der Weg zu gehen. Ich nehme an, Sie kümmern sich nicht um die Verschlüsselung von Daten, aber Sie tun Sie darauf, dass die Daten „zugelassen“.

Nehmen wir an Sie haben 3 Computer

Komp1 comp2 Comp3

Lassen Sie uns sagen auch Sie Komp1 wollen eine Nachricht an Comp3 senden. Sie kümmern sich nicht, wenn die Nachricht abgefangen wurde, aber Sie Sorgfalt tun, dass es nicht gefälscht wurde.

Komp1 wird digital signieren die Nachricht mit seinem privaten Schlüssel

Komp2 die Nachricht von Komp1 zu Comp3 abzufangen, kann aber nicht die Nachricht ändern, ohne die Signatur ungültig zu machen

Komp2 wird die Nachricht auf Comp3 weiterleiten

Comp3 wird Komp1 die öffentlichen Schlüssel verwenden, um die Signatur zu entschlüsseln und den Hash in der Signatur verwenden, um den Inhalt zu überprüfen.

Nun, wenn Sie die Daten verschlüsseln möchten, müssen Sie einen zusätzlichen Schritt hinzufügen

Komp1 wird digital signieren die Nachricht mit seinem privatem Schlüssel

Komp1 wird einen zufälligen Verschlüsselungsschlüssel (in der Regel AES) erzeugen und die Nachricht verschlüsseln.

Komp1 nehmen, dass die Verschlüsselungsschlüssel und verschlüsselt sie mit Comp3 öffentlicher Schlüssel

Komp2 die Nachricht abfangen, aber kann es nicht lesen, ohne Comp3 private Schlüssel

Komp2 wird die Nachricht auf Comp3 weiterleiten

Comp3 wird es die privaten Schlüssel verwenden, um den AES-Schlüssel zu entschlüsseln

Comp3 wird die gesamte Nachricht mit dem AES-Schlüssel

entschlüsseln

Comp3 die Nachricht bestätigen, indem die Signatur mit Komp1 öffentlichen Schlüssel entschlüsseln.

Signatur enthält einen Hash der Nachricht, wenn der Hash und die Hash-Spiel der Nachricht, dann die Daten intakt ist.

Sie können die GUIDs in der Nutzlast auf die Verwendung als Lookup enthalten, die öffentlichen Schlüssel zu verwenden, um zu entscheiden.

P. S. Sie werden die integrierten Methoden verwenden möchten, eine Nachricht zu unterzeichnen. Lassen Sie das Framework das Hashing tun / etc

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top