RSA Publick-Key und Man-in-the-Middle in eigenen Projekten

Design Patterns, Erklärungen zu Algorithmen, Optimierung, Softwarearchitektur
Forumsregeln
Wenn das Problem mit einer Programmiersprache direkt zusammenhängt, bitte HIER posten.
Antworten
Benutzeravatar
Thoran
Establishment
Beiträge: 224
Registriert: 15.05.2009, 12:51
Wohnort: Stuttgart
Kontaktdaten:

RSA Publick-Key und Man-in-the-Middle in eigenen Projekten

Beitrag von Thoran »

Guten Abend zusammen,

ich beschäftige mich gerade ein bisschen mit RSA und habe da ein Problem mit der Verteilung des Public-Keys. Grundsätzlich ist es ja so, wenn ich eine Person Bob habe und die hat sich ein Schlüsselpaar erzeugt, dass diese Person dann ihren Public-Schlüssel frei verteilt an Personen die mit Bob in Verbindung treten wollen, z.B. Alice. D.h. also Bob stellt den Public-Key z.B. auf seine Webseite.
Alice will jetzt mit Bob in Verbindung treten und lädt sich den Publickey herunter, um Ihre erste Nachricht zu verschlüsseln. Diese Vorgang ist unverschlüsselt und läuft über ganz normale IP-Kommunikation, im Falle der Webseite z.B. über HTTP, d.h. jeder kann es mitlesen wenn er will.
Hier setzt jetzt nun mein Verständnisproblem ein:
Nehmen wir an es gibt einen Bösewicht Joe, der sich als Man-in-the-middle in die Kommunikation zwischen Bob und Alice setzt. D.h. er liest mit, dass Alice den Publickey herunter lädt, er fängt diesen ab, ersetzt ihn durch seinen eigenen und schickt diesen stattdessen an Alice. Wenn jetzt Alice ihre geheime Nachricht mit dem empfangenen Public-Key verschlüsselt und an Bob schickt, fängt Joe diese Nachricht wieder ab entschlüsselt sie mit seinem eigenen privaten Key, verschlüsselt die geheime Nachricht wieder mit Bobs Publickey und schickt die Nachricht weiter an Bob. Niemand merkt, das Joe die geheime Nachricht mitgelesen hat und Joe hat alle Infos der geheimen Nachricht empfangen.
Wie kann ich dieses Szenario vermeiden? Muss ich dazu den Publickey von Bob an Alice vorverteilen (z.B. embedded in Binary)? Steh ich einfach nur auf dem Schlauch und ich muss das übermitteln des Publickeys einfach nur noch mit zusätzlichen Sicherheitsmechanismen absichern (Stichwort: Nonce, MAC)?

Für Anregungen wäre ich dankbar
Thoran
Wer Rechtschreibfehler findet, darf diese gerne behalten.
Mein Entwicklertagebuch
Aktuelle Projekte: Universum: Domination (ehemalig AlphaOmega),Universum: Sternenjäger, PixelWars: Highscore-based Top-Down-Spaceshooter
Spieleengine Unreal 5
DerAlbi
Establishment
Beiträge: 269
Registriert: 20.05.2011, 05:37

Re: RSA Publick-Key und Man-in-the-Middle in eigenen Projekt

Beitrag von DerAlbi »

Public heißt ja nicht unbedingt, dass der Schlüssel unverschlüsselt verschickt werden MUSS, sondern nur, dass er gewusst werden DARF. Schlüsselaustausch über Diffie-Hellman kann man immer als Abstraktion obendrüber hauen.
Benutzeravatar
Jonathan
Establishment
Beiträge: 2353
Registriert: 04.08.2004, 20:06
Kontaktdaten:

Re: RSA Publick-Key und Man-in-the-Middle in eigenen Projekt

Beitrag von Jonathan »

Naja, 'jeder kann mitlesen' stimmt ja auch nicht so ganz, es ist ja nicht komplett trivial sich dazwischen zu schalten.
Aber prinzipiell hast du natürlich recht, man muss irgendwie wissen, mit wem man redet. Es gibt dafür eine ganze Reihe von Konzepten, z.B. Web of Trust. Für HTTPS läuft es (glaube ich) im Wesentlichen so, dass die Browser mit ein paar Zertifikaten kommen, die dann benutzt werden, um sicherzustellen, dass man mit Zertifizierungsstellen redet, und die können dir wiederum sagen, dass du mit der richtigen Webseite redest. Aber irgendetwas musst du immer wissen bzw. haben. Man kann nicht erwarten, mit einer komplett unerwarteten Person zu reden und sich dann sicher zu sein, dass es die richtige ist.
Eine weitere Alternative sind Seitenkanäle. Vielleicht chatte ich mit jemanden, bin mir aber nicht sicher, ob jemand in der Leitung ist. Aber wenn ich ihm jetzt eine SMS schicke (in der der Schlüssel verglichen wird), müsste ein Angreifer zusätzlich die SMS abfangen und dafür unsere beiden Handynummern kennen - das ist schon sehr viel schwieriger. Wenn einem das nicht sicher genug ist, muss man den Schlüssel bei einem privaten Treffen austauschen, oder über vertrauenswürdige Dritte (was dann wieder Zertifizierungsstellen bzw. Web of Trust wäre).
Wenn du die Schlüssel in die Binary packst, muss der Benutzer natürlich auch sicherstellen, dass die Binaries nicht verändert wurden (da kann es ja auch einen Man-in-the-Middle geben!). Das geht z.B. über Prüfsummen, die es auf der Webseite gibt. Die Webseite muss natürlich auch wieder abgesichert sein (selbe Idee), z.B. über HTTPS. Dafür muss der Benutzer aber die Webseite mit einem Browser besuchen, der keine gefälschten Zertifizierungsstellenzertifikate enthält (Browserbinaries kann man ja auch manipulieren). Du siehst schon, das ganze ist beliebig kompliziert, wenn man nur paranoid genug ist.

Um welche Anwendung geht es bei dir denn konkret?
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
Benutzeravatar
Thoran
Establishment
Beiträge: 224
Registriert: 15.05.2009, 12:51
Wohnort: Stuttgart
Kontaktdaten:

Re: RSA Publick-Key und Man-in-the-Middle in eigenen Projekt

Beitrag von Thoran »

Es geht im wesentlichen um einen kleinen REST-Service den ich geschrieben habe. Dazu verwende ich eine Bibliothek, die einen kleinen HTTP-Server eingebaut hat, der aber, soweit ich das gesehen habe kein HTTPS kann. Aber ich glaube tatsächlich, dass ich auf dem Schlauch stand. Es gibt eine einfachen Fehler in meiner obigen Ausführung. Ich habe keine Authentifizierung des Senders. Wenn ich es richtig verstanden habe, ist das bei HTTPS über das Zertifikat gelöst, welches den Publickey enthält, was durch eine vertrauenswürdige CA signiert wurde, so dass ich sicher sein kann, dass der im Zertifikat enthaltene PublickKey tatsächlich zu der im Zertifikat aufgeführten Entität gehört.
Da ich das ganze Hobbymäßig mache, bleibt nur mein Zertifikat self-signed zu erstellen und die Infos der self-signing-CA im Binary mitzuliefern. Dieser Schritt entfällt ja normalerweise, weil bekannte CAs bereits im OS installiert sind. Um Manipulationen am Binary zu verhindern muss ich dass natürlich entweder mit einer Checksumme prüfbar machen oder das Binary wieder signieren, da beist sich die Katze dann wieder in den Schwanz, wenn ich die Binarysignatur wieder mit meiner self-signing CA erstelle.
Aber letzten Endes sollte es wohl für meine Hobbyzwecke ausreichend sein. Ich denke wenn ich in die Verlegenheit komme, das ganze größer zu verteilen, kann ich immer noch ein Codesigning-Zertifikat der bekannten CAs besorgen. Wobei das dann wohl den finanziellen Rahmen eines Hobbyprojekts sprengt.
Wer Rechtschreibfehler findet, darf diese gerne behalten.
Mein Entwicklertagebuch
Aktuelle Projekte: Universum: Domination (ehemalig AlphaOmega),Universum: Sternenjäger, PixelWars: Highscore-based Top-Down-Spaceshooter
Spieleengine Unreal 5
Benutzeravatar
Jonathan
Establishment
Beiträge: 2353
Registriert: 04.08.2004, 20:06
Kontaktdaten:

Re: RSA Publick-Key und Man-in-the-Middle in eigenen Projekt

Beitrag von Jonathan »

Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
Antworten