RSA File Encryption für lazarus

Alle Fragen zur Netzwerkkommunikation
Antworten
Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

RSA File Encryption für lazarus

Beitrag von Nimral »

Gute Abend,

ich möchte eine Datei mit einem Private/Public Key Verfahren ver- und entschlüsseln.
Ich fand bisher einige Bruchstücke für eine auf der OpenSSL Library basierten Datei Ver- und Entschlüsselung, vor allem hier:

https://github.com/graemeg/freepascal/t ... es/openssl

In den Examples fand ich ein Beispiel wie man die Schlüssel erzeugt. Dann fand ich auch noch irgendwo in den Weiten einen Hinweis (bzw. die Header) für 4 Prozeduren mit denen man blockweise ver- und entschlüsseln konnte, damit hätte ich dann vermutlich alle Bausteine beisammen gehabt. Leider habe ich den Link nicht gespeichert.

Hat mir jemand einen Tipp wo ich suchen muss?

Weiters: ich war eigentlich drauf vorbereitet, dass ich OpenSSL installieren muss, zu meinem Erstaunen lief das Sample aber auf Anhieb. Nach einiger Sucherei fand ich dann tatsächlich eine version von openSSL in einem Unterverzeichnis von Windows. Ich kann mich nicht erinnern, es installiert zu haben, in der Liste der installierten Softwarepakete kommt es auch nicht vor, vermutlich hat es irgendeine Software mitgebracht. Um solche Probleme auf den Zielrechnern zu vermeiden, könnte ich die OpenSSL Library natürlich als Datei mitgeben, aber das ist eine schlechte Lösung. Ich meine aber irgendwo mal einen Trick gesehen zu haben, wie man DLLs als Ressource zu seiner Exe dazupacken kann ... das kann aber auch für Delphi gewesen sein.

Weiß da jemand etwas darüber?

Thnx, Armin.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6199
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: RSA File Encryption für lazarus

Beitrag von af0815 »

Graeme betreibt einen Spiegel für den fpc, damit man den auch unter GIT hat. Das heisst du findest die Sachen auch, wenn du die FPC Sourcen installierst hat. Das heisst das Paket ist Teil des FPC.
Das wird auch der Grund sein, das du das Paket am Rechner gefunden hast.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: RSA File Encryption für lazarus

Beitrag von Warf »

Der FPC liefert eine OpenSSL unit mit, die die C funktionen wrapped. Hier ist ein C beispiel: https://stackoverflow.com/questions/503 ... crypt-in-c, die übersetzung von Pascal nach C ist sehr einfach

Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Re: RSA File Encryption für lazarus

Beitrag von Nimral »

Das war der Linkd en ich gesucht habe, danke!

Ich sehe jetzt aber gerade, dass RSA_public_encrypt und seine 3 Kumpels in OpenSSL "deprecated" sind.

Überhaupt passt mir der ganze Lösungsansatz nicht. Ich muss ein (kurzes) File asymmetrisch verschlüsseln, damit man es sicher übermitteln kann. Dazu wird ein installiertes OpenSSL benötigt, das ist bei Rechnern die man nicht unter eigener Kontrolle hat ein potenzieller Fallstrick.

Gibt es denn keine Pascal Implementierung von OpenSSL, oder ein ähnliches Verfahren, das komplett ohne externe dlls auskommt?

Armin.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6199
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: RSA File Encryption für lazarus

Beitrag von af0815 »

Nornalerweise wird es bei solchen Sachen keine native Implementation geben. Schon aus Sicheeheitsgründen und die damit verbundene Wartung. Selbst das mitliefern der dll ist genaugenommen eine Sicherheitslücke. Weil wer fixt die dll laufend.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Re: RSA File Encryption für lazarus

Beitrag von Nimral »

Ich sag ja, ich mag die Lösung mit der externen dll nicht. Aus Installationsgründen erst mal, schließlich ist einer der größeren Vorteile von Lazarus, dass man echte Standalone-exe erzeugen kann, dann dahin.

Sicherheitsbedenken habe ich auch, wer oder was würde mich konkret daran hindern, eine dll zu erstellen, sie "libeay32.dll" zu nennen, und die filebasierten Encrypt-Funktionen durch Dummies mit gleichem Namen und Parametern zu implementieren und zu exportieren und die dll dann ins Programmvrezeichnis zu kopieren? ich habs nicht versucht, aber meiner Meinung nach würde das Programm, welches die dll nützt, dann die zu verschlüsselnden Daten Klartext bei meiner dll abliefern.

Daher meine Frage, ob es kein ähnliches Verfahren gibt, für das es eine Pascal Implementierung gibt, oder auch irgendwas eingebaut im Windows API. Ich kann mir kaum vorstellen, dass es im Microsoft Biotop keine Alternative zu OpenSSL gibt.

Alternativ eine Möglichkeit, eine ungetürkte libeay32.dll als Resource in die exe einzubetten und - jetzt kommts - "irgendwie" dafür zu sorgen, dass die API calls zu ihr und nur zu ihr gelangen können. Ich meinte da für Delphi mal was gesehen zu haben. Ich sehe Deine Bedenken bezüglich Wartbarkeit, halte das aber für eher beherrschbar als das Ausrollen von OpenSSL nur weil mein Programm eine Funktion davon nützt.

Armin.

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: RSA File Encryption für lazarus

Beitrag von Warf »

Die OpenSSL wird normalerweise von gemanaged. Windows (seit ein paar jahren) liefert eine mit die mit dem Windows Updater geupdated wird und unter Linux ist diese normalerweise über den Paketmanager vorhanden und up to date.
Nimral hat geschrieben:
So 25. Apr 2021, 15:17
Sicherheitsbedenken habe ich auch, wer oder was würde mich konkret daran hindern, eine dll zu erstellen, sie "libeay32.dll" zu nennen, und die filebasierten Encrypt-Funktionen durch Dummies mit gleichem Namen und Parametern zu implementieren und zu exportieren und die dll dann ins Programmvrezeichnis zu kopieren? ich habs nicht versucht, aber meiner Meinung nach würde das Programm, welches die dll nützt, dann die zu verschlüsselnden Daten Klartext bei meiner dll abliefern.
Du kannst deine software nicht vor dem Nutzer beschützen, so funktioniert Crypto auch nicht. Wenn einer der Teilnehmer seine geheimnisse ausplaudern will kannst du so viel crypto benutzen wie du willst, das wird ihn nicht hindern.

Sicherheitsgründe sind eher die vielzahl an bugs und schwächen in dem Code. Das wichtigste für eine Crypto lib ist testen. Die OpenSSL ist die meist verwendete und damit meist getestete Crypto Lib, wenn ein Bug gefunden wird wird der innerhalb weniger Stunden gefixt und ist teil des updatezykluses des Betriebsystems.
Nimral hat geschrieben:
So 25. Apr 2021, 15:17
Daher meine Frage, ob es kein ähnliches Verfahren gibt, für das es eine Pascal Implementierung gibt, oder auch irgendwas eingebaut im Windows API. Ich kann mir kaum vorstellen, dass es im Microsoft Biotop keine Alternative zu OpenSSL gibt.
Der Grundalgorithmus hinter RSA ist sehr sehr einfach, so einfach das es Standard ist das erstsemester Informatikstudenten den implementieren als Teil des Diskreten Mathemathik moduls. Doch das Problem liegt in den details. So muss die implementierung sicher gegen Sidechannel angriffe sein, das keymanagement muss sicher sein (key storage, key generation, key usage), korrekte padding verfahren müssen implementiert werden, etc. und das wichtigste, bugs wie buffer overflows können deine gesammte security zunichte machen.

Eine schlechte Crypto implementierung zu benutzen ist genauso gut wie einfach gar keine Crypto zu benutzen. Die Pascal community ist einfach nicht groß genug um auch nur im ansatz die Sicherheit zu bieten die du benötigst.
Nimral hat geschrieben:
So 25. Apr 2021, 15:17
Alternativ eine Möglichkeit, eine ungetürkte libeay32.dll als Resource in die exe einzubetten und - jetzt kommts - "irgendwie" dafür zu sorgen, dass die API calls zu ihr und nur zu ihr gelangen können. Ich meinte da für Delphi mal was gesehen zu haben. Ich sehe Deine Bedenken bezüglich Wartbarkeit, halte das aber für eher beherrschbar als das Ausrollen von OpenSSL nur weil mein Programm eine Funktion davon nützt.

Armin.
Wie gesagt die OpenSSL müsste mittlerweile part von Windows 10 sein, spätestens seit Windows die OpenSSH binaries mitliefert, da diese die OpenSSL benutzen. Ansonsten kannst du die OpenSSL statisch gegen dein pascal program linken, dann wird die bibliothek mitkompiliert.

Aber das ist auch komplett der falsche Sicherheitsansatz, denn dann musst du jedes mal wenn es ein OpenSSL update gibt dein programm neu kompilieren und ausrollen. Wenn du in urlaub bist und es kommt ein großer Bug in der OpenSSL raus, dann musst du halt trotz urlaub bereit sein dein programm zu updaten, für die gesammte lebenszeit deines programms. Um ehrlich zu sein, mir wär das zu stressig.

Und wie gesagt, das die lokale bibliothek kompromitiert wurde ist kein wirkliches Sicherheitsproblem, denn wenn jemand die möglichkeit hat deine lokalen dateien zu verändern, dann dieser angreifer auch einfach deinen private key auslesen, oder deine anwendung patchen und somit die sicherheit komplett kompromitieren.
Durch die verwendung von Crypto willst du mithörer und leute die die kommunikation abpassen und bearbeiten können verhindern, wenn der angreifer zugang zu dem lokalen system hat hast du eh schon verloren. Dagegen gibt es keine Crypto Lösung

Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Re: RSA File Encryption für lazarus

Beitrag von Nimral »

Warf,

OpenSSL bei Windows dabei? Ich glaub ich habs gefunden: "OpenSSH wurde Windows im Herbst 2018 hinzugefügt und ist in Windows 10 und Windows Server 2019 enthalten." Dann ist für mich alles gut.

Meine Idee ist, mir ein Keypair zu generieren, und meinen PublicKey in meine Software einzubauen. Damit verschlüssle ich dann die Files, die ich an mich zurücksende. Eine Rückantwort an das Programm ist weder notwendig noch vorgesehen. Ein private Key ist also nicht gefährdet, selbst wenn ich den Quellcode offen lege.

Armin.

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: RSA File Encryption für lazarus

Beitrag von Warf »

Nimral hat geschrieben:
So 25. Apr 2021, 20:26
Warf,

OpenSSL bei Windows dabei? Das wäre eine gute Nachricht. Ich kenne bisher nur die separate Download-Version.

Weißt Du zufällig, ab welcher Windows Version OpenSSL bzw. OpenSSH mit dabei war? Ich finde zwar tonnenweise Anleitungen wie man es runterlädt und installiert, aber keine Info ab wann es mit dabei war. Wenn ich mich drauf verlassen kann, dass es bei allen halbwegs aktuellen Windows 10 Maschinen mit dabei ist, reicht mir das.
Seit OpenSSH dabei ist, gibt es die C:\Windows\system32\ssleay32.dll. Ich weiß nicht ob die 100% openssl kompatibel ist, aber beim reinschauen hab ich zumindest schonmal die ganzen Signaturen für die RSA funktionen gefunden.
Meine Idee ist, mir ein Keypair zu generieren, und meinen PublicKey in meine Software einzubauen. Damit verschlüssle ich dann die Files, die ich an mich zurücksende. Eine Rückantwort an das Programm ist weder notwendig noch vorgesehen. Ein private Key ist also nicht gefährdet, selbst wenn ich den Quellcode offen lege.
An dieser stelle machst du dir dein leben nur unnötig kompliziert wenn du das selbst implementierst. Was du grade beschreibst ist eine Transportverschlüsselung zwischen dem client und server. Du willst also grade TLS neu erfinden. Da hab ich gute nachrichten, TLS gibts schon, du musst das nicht selbst bauen.

Ich würde einfach HTTPS benutzen, einfach aufzusetzen und mittels fpweb und dem fphttpclient super einfach in die eigene anwendung einzubauen

Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Re: RSA File Encryption für lazarus

Beitrag von Nimral »

Warf hat geschrieben:
So 25. Apr 2021, 21:06
Ich würde einfach HTTPS benutzen, einfach aufzusetzen und mittels fpweb und dem fphttpclient super einfach in die eigene anwendung einzubauen
Hi Warf,

da bist Du sicher im allgemeinen Fall auf dem richtigen Weg, aber es gibt auch Inselanwendungen, die keine Anbindung ans Internet haben dürfen. Das Mitbringen und Installieren von dlls ist hoch problematisch. Es wird deswegen beauftragt dass der Entwickler möglichst mit dem auskommen muss, was die zur Verfügung gestellte Plattform im momentan installierten Release-Stand mitbringt. Auch allzu groß über diese Projekte herumerzählen darf er nicht.

Nehmen wir an, ich müsste aus so einem Bereich eine sensible Datei, die bei der Installation meiner Software generiert wird, zu mir schaffen ... dann würde ich es genau so machen wie ich es beschrieben habe. Einen Public Key mitgeben, die Daten in einer Datei verschlüsselt ablegen, die auf irgendeinem erlaubten Weg, z.B. über einen gesicherten USB Stick, nach draußen schaffen, und dann könnte man sie mir unbesorgt auf jedem beliebigen Weg zukommen lassen.

Da wäre doch so ein Aufbau wie ich ihn vor habe eine angemessene Lösung.

Armin.

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: RSA File Encryption für lazarus

Beitrag von Warf »

Nimral hat geschrieben:
Mo 26. Apr 2021, 05:53
da bist Du sicher im allgemeinen Fall auf dem richtigen Weg, aber es gibt auch Inselanwendungen, die keine Anbindung ans Internet haben dürfen. Das Mitbringen und Installieren von dlls ist hoch problematisch. Es wird deswegen beauftragt dass der Entwickler möglichst mit dem auskommen muss, was die zur Verfügung gestellte Plattform im momentan installierten Release-Stand mitbringt. Auch allzu groß über diese Projekte herumerzählen darf er nicht.
Internetanbindung wird ja nicht unbedingt benötigt, in sicherheitskritischen anwendungen wie z.b. Wasserwerken werden ja sehr oft private Netzwerke, entweder über abgeschottete WANs oder sogar übers internet via VPNs verwendet, über die man dann ganz normale application layer protokolle wie HTTP verwenden kann.
Aber gut, angenommen es gibt keine IP verbindung in irgendeiner art und weise, dann ist das natürlich ein anderes problem.
Nimral hat geschrieben:
Mo 26. Apr 2021, 05:53
[...]

Da wäre doch so ein Aufbau wie ich ihn vor habe eine angemessene Lösung.
Nein wäre es nicht. Wie ich schon gesagt habe, Crypto ist nicht so einfach wie man denkt, auch wenn die Verfahren an sich einfach sind.

RSA ist keine blockchiffre. RSA ist nicht designed um belibige daten streams zu verschlüsseln, sondern um zahlen die kleiner als der Modulus des Keys zu verschlüsseln. Bei einem standard 2048 RSA key, kannst du also allerhöchstens 256 byte verschlüsseln. Du kannst zwar einfach deine daten in kleiner blöcke brechen und die dann verschlüsseln, allerdings bist du dann gegen chosen plaintext angriffe und statistische auswertung angreifbar. Mal ganz davon abgesehen das RSA so rechenintensiv ist das größere Datenmengen einfach nicht skalieren.
Was du machen könntest ist das du einen Symmetrischen Schlüssel, z.b. für AES generierst und dann nur den mittels RSA verschlüsselst und den rest der nachricht mit diesem schlüssel verschlüsselst.
Allerdings muss dann da natürlich gesichert werden das der Rechner der das generiert einen Kryptografisch sicheren Zufallszahlengenerator hat.

Abgesehen davon stellst du mit dieser Crypto nur die Confidentiality sicher, nicht die Datenintegrität. Beispiel, wenn jemand diesen USB stick in die hände bekommt, kann er ihn zwar nicht lesen, aber er kann ihn mit eigenen daten überschreiben und du kannst nicht rausfinden ob die daten echt sind. Das kann natürlich schwerwiegende konsequenzen haben, stell dir eine messtation vor die dem Wasserwerk die ganze zeit den Wasserdruck in einem Gebäude meldet. Ein angreifer der jetzt die daten überschreiben kann, ohne sie selbst lesen zu können, könnte jetzt einfach immer die daten mit 0 überschreiben (wenn er das format kennt), und das wasserwerk würde den druck immer weiter erhöhen bis die rohre platzen.
Führ gewöhnlich willst du immer die CIA Säulen der IT security abdecken: Confidentiality: Nur bestimmte leute können die daten lesen, Integrety: nur bestimmte leute können die daten schreiben und Availability: der Service muss erreichbar sein

Wie protokolle wie z.b. TLS das lösen ist über einen signierten Diffie Hellman schlüsseltausch. Das schlägt beide fliegen mit einer klappe. Durch den DH schlüsseltausch wird sichergestellt das ein Symmetrisches passwort generiert wird was nur die beiden parteien kennen, und durch die signatur (RSA oder DSA mit ECC) wird sicher gestellt das beide parteien auch die sind für die sie sich ausgeben.
Für anwendungen bei denen keine echtzeitkomminikation möglich ist, z.B. chat services ist das auch möglich, dabei veröffentlicht der server eine reihe an DH messages mit seinem Public key, und der client schnappt sich eine von denen, macht seine lokalen berechnungen und sendet seinen teil des DH schlüsseltauschs zusammen mit der verschlüsselten nachricht an den server. Alles natürlich signiert.

Langer Rede kurzer Sinn, Crypto ist kompliziert, und einfach RSA zum verschlüsseln zu benutzen reicht so nicht aus. Und was du definitiv nicht machen solltest ist dein Crypto Wissen von einem Anonymen typen aus dem Internet zu ziehen. Wenn du selbst nicht qualifiziert genug bist das umzusetzen (was jetzt keine beleidigung o.ä. sein soll, die meisten sind nicht qualifiziert dafür, ich auch nicht), dann bezahl jemanden der es ist sich der Sache anzunehmen oder sag deinem Chef er soll jemanden für die Crypto engagieren. Schlechte Crypto ist genauso gut wie keine Crypto, und wenn kein geld da sein sollte um sich gute Crypto zu leisten, dann kann mans auch gleich sein lassen.

Antworten