eigene Verschlüsselung für Livestream verwenden

MiniMi12

Cadet 2nd Year
Registriert
März 2020
Beiträge
22
Hallo Leute,

ich habe mir ein eigenes Projekt für die Uni überlegt. In dem ich einen Kamera Livestream mit einer eigenen Verschlüsselung absichern möchte. Das mache ich natürlich nur für das Projekt und weiß selber, dass das in der Realität die Verwendung von eigenen Verschlüsselungsmethoden nicht empfehlenswert ist. Es soll nur zur Veranschaulichung dienen.

Die Kamera soll nur aus dem Heimnetzwerk erreichbar sein. Den Livestream habe bereits mit einem RaspberryPI 3b und dem Tool Motion umgesetzt. Mit Hilfe von Motion bekomme ich einen Livestream den ich einfach über den Browser aus dem Heimnetzwerk erreichen kann. Motion hat zwei verschiedene Möglichkeiten zur Absicherung des Streams. Einmal eine einfache http Authentification und eine mit MD5.
Ich habe die einfache http Authentification gewählt und möchte die sicherer machen. Dafür habe ich mit Hilfe von dem Buch Kryptografie für Dummies gelernt wie ich in Python eine RSA-Verschlüsselung programmiere.

Jetzt verzweifel ich daran, wie ich diese Verschlüsselung implementieren kann. Kann mir da jemand weiterhelfen?
Weil ich vermute, dass ich das Tool Motion nicht mehr verwenden kann habe ich einen Apache2 Server installiert und den mod_wsgi installiert, um python-Scripts ausführen zu können. Leider funktioniert der noch nicht.

Vielen Dank im voraus
MiniMi12

Edit:

Ich möchte den Zugang zum Livestream besser absichern. Das habe ich blöderweise falsch erklärt. http Authentification verschickt das Passwort unverschlüsselt und diese Passwortübertragung würde ich gerne verschlüsseln.
 
Zuletzt bearbeitet:
Ein paar Sachen sind hier etwas durcheinander:
1. Motion verschlüsselt den Stream nicht. Nur der Zugang ist "gesichert". Da der Stream als MJPEG-Stream über HTTP geschickt wird, ist da nix verschlüsselt. Umstellen falls möglich auf HTTPS würde den Stream verschlüsseln. Das ist aber wohl nicht das, was du willst.
2. RSA ist nicht wirklich geeignet um eine Stream zu verschlüsseln. Klar, irgendwie mit viel gefrickel kann man da eine langsame Lösung bauen, aber schön ist es nicht. RSA nimmt man meist für den Austausch des richtigen Schlüssels, mit dem z.B. via AES verschlüsselt wird.
Ergänzung ()

Gefühlt würde ich eher auf eine GStreamer-basierte Lösung gehen, falls du dafür spaßeshalber ein Plugin schreiben willst.
 
Oh danke du hast recht ich habe das durcheinander gebracht. Mir reicht es schon den Zugang zum Stream besser abzusichern. Bei der http Authentification wird das Passwort im Klartext übertragen und das möchte ich selber verschlüsseln, damit man zum Beispiel mit Wireshark das Passwort nicht einfach mithören kann.
 
Je nachdem, wie du das machst, wird es besser oder nicht. :)

Angenommen, du schickst statt "SuperGeheimesPasswort" den String "mdsfisjr3ir3nf03i2jnf3j", der aber immer gleich ist über HTTP. Kann ein "Angreifer" ja einfach nur den "verschlüsslten" String schicken und schon ist es wie vorher. Das hilft also nicht.
 
Danke für den Tipp mit GStreamer das gucke ich mir jetzt mal an.
 
Deswegen gibt es andere Verfahren wie z.B. HTTPS. Dort kann ein böser Angreifer nicht ohne weitere reingucken.
Andere Verfahren wären sowas wie HOTP etc., da gibt es eine Menge.
 
Bzgl. GStreamer: Eine Pipeline mit der man einen UDP Stream rausbläst sieht z.B. so aus:

Code:
gst-launch v4l2src device=/dev/video0 ! 'video/x-raw-yuv,width=640,height=480' !  x264enc pass=qual quantizer=20 tune=zerolatency ! rtph264pay ! udpsink host=127.0.0.1 port=1234

Zum Empfangen (auf der selben Kiste):
Code:
gst-launch udpsrc port=1234 ! "application/x-rtp, payload=127" ! rtph264depay ! ffdec_h264 ! xvimagesink sync=false

Dazwischen könnte man Elemente hängen, die ver- und entschlüsseln.

https://stackoverflow.com/questions/7669240/webcam-streaming-using-gstreamer-over-udp
 
Deeen schrieb:
Deswegen gibt es andere Verfahren wie z.B. HTTPS. Dort kann ein böser Angreifer nicht ohne weitere reingucken.
Andere Verfahren wären sowas wie HOTP etc., da gibt es eine Menge.


Und genau das ist die Lösung!

Verbinde entweder den Raspi direkt mit nem LAN Kabel mit nem weiteren Rechner, auf dem du dann einen Reverseproxy mit https an den Start bringst, oder aber:

Du sorgst für eine https-Verbindung auf dem Raspi. Https benötigt aber "etwas" power.
Evtl. ist der Raspi da ein Flachenhals, wenn er neben dem Video noch die Encyption macht. Evtl. daher mit nem zweiten Raspi (oder du nimmst nen 4er, der hat mehr Power).

Und ich habe apache2 gelesen. Tu den weg, nimm nen nginx, der ist wesentlich genügsamer:


Nutzer -> Raspi/PC mit https-reverseProxy mit https -> Raspi mit http-stream

Oder aber:
Nutzer -> https-nginx mit Videostream

Nochmal der Hinweis:
Wenn das lokale Netz nicht sicher/isoliert ist, sorge dafür, dass bei > einem Gerät beide mit einem Kabel direkt miteinander verbunden sind. Sonst ist das nicht sicher.

SSL Cert selfsigned, oder du brauchst eine im Internet erreichbare Domain, wo du ein "echtes" Cert mit letsencrypt besorgst. Oder du kaufst für 50€ im Jahr von Comodo ein Login ssl cert oder so, wenn du keine Lust auf letsencrypt hast...!

nginx mit letsencrypt beispiel (musst du auf den Rapsi-distri umbiegen)

https://www.scaleway.com/en/docs/how-to-configure-nginx-reverse-proxy/
 
Deeen schrieb:
Je nachdem, wie du das machst, wird es besser oder nicht. :)

Angenommen, du schickst statt "SuperGeheimesPasswort" den String "mdsfisjr3ir3nf03i2jnf3j", der aber immer gleich ist über HTTP. Kann ein "Angreifer" ja einfach nur den "verschlüsslten" String schicken und schon ist es wie vorher. Das hilft also nicht.

Ja das hast du natürlich recht, das wäre nicht zielführend. Ich müsste dann einen Salt hinzufügen der sich ändert damit auch bei gleicher Passworteingabe ein anderer String herauskommt.
Ergänzung ()

@Deeen damit könnte ich dann den Stream ansich verschlüsseln verstehe ich das richtig? Dann würde ich den Stream auf dem Raspi verschlüsselt losschicken und müsste den dann auf dem Endgerät entschlüsseln?
Ergänzung ()

@teufelernie Danke für die Hilfe. Ich habe auch noch einen Raspi 4b mit dem größten Arbeitsspeicher. Diese Lösung klingt auch sehr gut. Aber dort läuft dann die gesamte Verschlüsselung über https? und ich habe sozusagen nichts selber geleistet oder?
 
Zuletzt bearbeitet:
Wenn du HTTPS nimmst, ja, da wird dir alles abgenommen.
Ergänzung ()

GStreamer hat bereits Plugins um Verschlüsselung zu realisieren. Siehe z.B. hier.
Das hindert dich aber nicht daran, aus Spaß etwas eigenes (und erstmal einfaches mit einem pre-shared-key) zu machen.
Ergänzung ()

Da wäre also nicht der Zugang, sondern der Stream selbst verschlüsselt. Also entweder jedes UDP Paket, oder jeder RTP Payload, oder ...
 
Dann wäre die https Lösung für die Realität natürlich sehr gut aber nicht das was ich möchte. Ich habe mir die Projektarbeit selber überlegt um was zum praktisches zum Thema Verschlüsselung zu lernen.

@Deeen danke ich möchte aufjedenfall was eigenes programmieren. Ich werde mich da jetzt mal einlesen vielleciht habe ich dann nochmal fragen :)
Ergänzung ()

Deeen schrieb:
Da wäre also nicht der Zugang, sondern der Stream selbst verschlüsselt. Also entweder jedes UDP Paket, oder jeder RTP Payload, oder ...
Alles klar ich werde das so versuchen danke ^^
 
Deinen Anspruch etwas lernen zu wollen ist sehr gut.

Aber: Alleine der Zusammenhang SSL Key, csr daraus, ein cert, eine CERT-Kette etc. für ein valides CERT ist nicht ganz ohne.

Mach das mit der Eigenentwicklung gerne zum lernen, aber: setz es bitte nicht ein.

Bei den etablierten Lösungen sind meist schon alle „Lessons learned“, alle doofen Fallstricke hatte schon jemand vor dir zu lösen. Und das Endprodukt relativ Safe.

Das Selbststrickzeug wird im Netz reihenweise umgeklopft. Das was du machst wird sicher klappen, aber dann hast du ... 60 Möglichkeit es zu knacken oder zu umgehen.
 
@teufelernie ja damit hast du aufjedenfall recht. Aber wie gesagt ich mache das nur für eine selbstüberlegte Projektarbeit und danach werde ich das nicht mehr nutzen. Das wird auch nur in meinem lokalen Netzwerk Zuhause getestet.
 
Ich habe jetzt ein paar Tage mit den Plugins befasst und muss leider zugeben, dass es meine Fähigkeiten doch übersteigt (Da wohl deutlich zu blauäugig ^^) und ich deswegen auf @teufelernie 's Lösung umsteigen möchte damit kann ich ja dann auch außerhalb des lokalen Netzes auf den Stream zugreifen was ja ganz nett ist. Ich habe da aber noch Fragen und zwar bei der Lösung:

Nutzer -> https-nginx mit Videostream

Wie stelle ich dort sicher, dass nur Nutzer Zugang zum Stream bekommen, den ich das erlaube?
 
MiniMi12 schrieb:
damit kann ich ja dann auch außerhalb des lokalen Netzes auf den Stream zugreifen was ja ganz nett ist
So einfach wird das auch nicht, da brauchst du evtl. DynDNS und Portforwarding etc., damit der Stream von außen erreichbar ist.
Als Inspiration hier mal nachlesen, wie man bei nginx die Authentifizierung bei HTTPS aktivieren kann: klick mich

Nochmal ein alternativer Vorschlag: Dort auf dem Server, auf dem Motion läuft, einen VPN Server installieren (OpenVPN oder Wireguard) und den Clients entsprechend Zertifikate ausstellen für die VPN Verbindung. Motion dann so konfigurieren, dass es nur auf der VPN-Verbindung lauscht. Damit hättest du den Zugriff und die Authentifizierung an den VPN-Service delegiert.
 
Danke @Deeen das werde ich mir beides mal anschauen und mich dann wieder melden.


DynDNS etc., habe ich schonmal benutzt um den Stream probehalber online zustellen das sollte kein Problem mehr sein.
 
probiere es erstmal mit nem selfsigned cert. Wenn das tut, dann kannst du immer noch auf letsencrypt. etc wechseln. SIehe dazu auch den Link in meinem Post
 
Du kannst auch HLS Verschlüsselung verwenden. Z.B. kann das SRS. FFMPEG kann das auch, wenn man es etwas simpler haben möchte.
 
Zurück
Oben