Forum: Mikrocontroller und Digitale Elektronik Passwort bzw. Schlüssel im Quelltext


von Ekkehard D. (ekkehard)


Lesenswert?

Hallo,
ich bin dabei ein Pärchen aus einer Mikrocontroller-Firmware und einer 
PC-Software zu bauen, deren Kommunikation verschlüsselt ablaufen muss.
Der hierzu notwendige gemeinsame Schlüssel (die Verschlüsselung ist 
symetrisch) muss logischerweise zur Laufzeit dem Programm zur Verfügung 
stehen.
Jetzt möchte ich eigentlich nicht, dass im Quelltext irgendwo der 
Schlüssel zu sehen ist, denn dann ist die Chance groß, dass zufällig 
oder fahrlässig der Schlüssel mal irgendwohin kopiert wird.
Für die PC-Software habe ich gedacht, dass der Schlüssel in einer Datei 
liegt, die mit einem weiteren Schlüssel verschlüsselt ist und vom 
Benutzer geladen werden muss. Das ist zwar lästig, aber es gibt eben nie 
eine Datei in der der Schlüssel in Klarschrift drin liegt. Selbst wenn 
das Benutzerpasswort auf irgendeinem Zettel am PC steht, wer die Datei 
versehentlich an ein E-Mail ranhängt wird nicht auch noch ein Foto des 
"Gelben Zettels" beifügen.

Aber bei der Firmware habe ich keine Idee wie ich das machen könnte.
Man könnte den Schlüssel bei der Inbetriebnahme des Systems eintragen, 
aber dann landet er in einem EEProm/Flash-Speicher welcher ggf. 
überschrieben werden könnte, insofern wäre es wirklich sicherer, der 
Schlüssel wäre im ausführbaren Code vorhanden. Kann man das mit einem 
Linker-Script machen, so dass der Schlüssel nur im HEXfile aber nicht im 
Quelltext drin ist? Also so ähnlich wie im PC Programm wo der Benutzer 
des Compilers beim Erzeugen des HEX-files erstmal sein eigenes Passwort 
eingeben muss?

Vielen Dank für Eure Ideen!
Gruß Ekkehard

von Christian (Gast)


Lesenswert?

Spricht was dagegen den Schlüssel auf dem Device zu generieren?
Dazu kann man eindeutige IDs benutzen.
Dann kann der Schlüssel für den PC einmalig mit einem Programm und dem 
angeschlossenen Gerät generiert werden.
Dann hast du keinen Schlüssel auf dem Gerät abgelegt, dieser wird immer 
beim Starten frisch generiert.

von Philipp G. (geiserp01)


Lesenswert?

Ekkehard D. schrieb:
> ich bin dabei ein Pärchen aus einer Mikrocontroller-Firmware und einer
> PC-Software zu bauen, deren Kommunikation verschlüsselt ablaufen muss.
> Der hierzu notwendige gemeinsame Schlüssel (die Verschlüsselung ist
> symetrisch) muss logischerweise zur Laufzeit dem Programm zur Verfügung
> stehen.

Da ist das Problem. Warum arbeitest Du nicht asymmetrisch?

> Aber bei der Firmware habe ich keine Idee wie ich das machen könnte.
> Man könnte den Schlüssel bei der Inbetriebnahme des Systems eintragen,
> aber dann landet er in einem EEProm/Flash-Speicher welcher ggf.
> überschrieben werden könnte, insofern wäre es wirklich sicherer, der
> Schlüssel wäre im ausführbaren Code vorhanden. Kann man das mit einem
> Linker-Script machen, so dass der Schlüssel nur im HEXfile aber nicht im
> Quelltext drin ist? Also so ähnlich wie im PC Programm wo der Benutzer
> des Compilers beim Erzeugen des HEX-files erstmal sein eigenes Passwort
> eingeben muss?

Safe ist das Verfahren ja sowieso nicht, da der Key immer 
unverschlüsselt im RAM liegt. Aber darum geht es Dir ja nicht, also ein 
paar Ideen:

Nimm für die Zusammensetzung des Master Keys nichtssagende Variablen, 
z.B

strA, strB, iX.

Fülle die Variablen an unterschiedlichen Zeilen mit beliebigen Werten. 
XOR'e das ganze mehrmals in dem Du die chars nach ASCII Werte 
unberechnest. Konkateniere dann das Ganze an unerwarteten Stellen. Wenn 
Du dahinter // define Master key schreibst kann es eh jeder lesen wo der 
Schlüssel berechnet wird, aber er kommt nicht so schnell dahinter wie 
dieser zusammengesetzt ist.

Du kannst auch eindeutige IDs (Hostname, fixe IP, MAC Adresse, etc) nach 
Ascii Werten umformen und beliebig XORen, quasi eine Pseudo Hash 
Funktion.
Da du einen gemeinsamen Schlüssel brauchst, müssen natürlich beide 
Seiten die Fix Werte kennen.

Wenn es Dein Protokoll vorsieht, könntest Du damit auch eine sehr 
einfache Diffie Hellman Implementation machen. Dazu müsste der Master 
Key niemals im Klartext über's Netz.

Andere Idee wäre, dass Du die SW den Schlüssel berechnet und an den 
Cient, die Firmware schickt. Zur Berechnung kannst Du MD5 oder blowfish 
oder nehmen.

Hasht einfach (time(in YYYYMMDD) + GetMacAdress(local)) und das was raus 
kommt ist der key.

: Bearbeitet durch User
von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Philipp G. schrieb:
> Da ist das Problem. Warum arbeitest Du nicht asymmetrisch?

Was ändert das? Auch asymmetrisch brauchst du einen Schlüssel um dich zu 
authentifizieren...

Philipp G. schrieb:
> Nimm für die Zusammensetzung des Master Keys nichtssagende Variablen,

du empfiehlst ernsthaft "security by obscurity"?

von Kräuterli (Gast)


Lesenswert?

Michael R. schrieb:
> Was ändert das? Auch asymmetrisch brauchst du einen Schlüssel um dich zu
> authentifizieren...

Aber zum Verschlüsseln einen anderen als zum Entschlüsseln.
Das ist ja gerade der Witz dabei (public/secret).

von OliverHB (Gast)


Lesenswert?

@Michael Reinelt: Und? Wo ist Dein (beserer) Vorschlag? Du scheinst es 
ja ganz genau zu wissen wie man auf gar keinen Fall machen darf. Also: 
Lass doch das Licht Deiner Weisheit über uns leuchten...

von Philipp G. (geiserp01)


Lesenswert?

Michael R. schrieb:
> Philipp G. schrieb:
>> Da ist das Problem. Warum arbeitest Du nicht asymmetrisch?
>
> Was ändert das? Auch asymmetrisch brauchst du einen Schlüssel um dich zu
> authentifizieren...

Das ändert alles, ja.

> Philipp G. schrieb:
>> Nimm für die Zusammensetzung des Master Keys nichtssagende Variablen,
>
> du empfiehlst ernsthaft "security by obscurity"?

GANZ GENAU - denn darum geht es:

Ekkehard D. schrieb:
> Jetzt möchte ich eigentlich nicht, dass im Quelltext irgendwo der
> Schlüssel zu sehen ist, denn dann ist die Chance groß, dass zufällig
> oder fahrlässig der Schlüssel mal irgendwohin kopiert wird

Ist alles nur eine Frage, welches Sicherheitslevel Du brauchst. Die 
Möglichkeiten sind unbegrenzt. Du könntest auch mit Fixwerten im Code 
arbeiten:

PC:

iX = 324;
iY = 23939;

s = (iX + iY) + 3 \ 3.4

Key(s) schickst Du an den Client, der Client rechnet dann das 
Umgekehrte, und bestimmt so den Masterkey.

von Kräuterli (Gast)


Lesenswert?

Michael R. schrieb:
> du empfiehlst ernsthaft "security by obscurity"?

Was empfiehlst du?
Bis jetzt hast du nur gesagt, wie er es NICHT machen soll.
Jetzt wäre es an der Zeit für einen Vorschlag, WIE er es machen soll.

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

OliverHB schrieb:
> @Michael Reinelt: Und? Wo ist Dein (beserer) Vorschlag? Du scheinst es
> ja ganz genau zu wissen wie man auf gar keinen Fall machen darf. Also:
> Lass doch das Licht Deiner Weisheit über uns leuchten...

Kräuterli schrieb:
> Was empfiehlst du?
> Bis jetzt hast du nur gesagt, wie er es NICHT machen soll.
> Jetzt wäre es an der Zeit für einen Vorschlag, WIE er es machen soll.

Was ist denn mit euch los? schlecht geschlafen? Freitag?

Das Problem ist kein triviales; und ich habe mir erlaubt darauf 
hinzuweisen dass triviale Lösungen nicht unbedingt zielführend sind...

Philipp G. schrieb:
> PC:
>
> iX = 324;
> iY = 23939;
>
> s = (iX + iY) + 3 \ 3.4

wie zum Beispiel diese...

Aber:

Philipp G. schrieb:
> Wenn es Dein Protokoll vorsieht, könntest Du damit auch eine sehr
> einfache Diffie Hellman Implementation machen. Dazu müsste der Master
> Key niemals im Klartext über's Netz.

Das kommt der Sache schon näher...

von Philipp G. (geiserp01)


Lesenswert?

Michael R. schrieb:
> Das kommt der Sache schon näher...

Ach? Diffie Hellman wäre eine Option für Dich, aber asymmetrische 
Verschlüsselung hast Du oben in den Wind geschlagen?

Der TO möchte, dass man aus dem Quelltext den Masterkey nicht auf die 
Schnelle herauslesen kann, so habe ich das verstanden. Das ist die 
Anforderung.

Ansonsten hätte ich ihm eine HSM mit Intrusion detection Level 7 
empfohlen, gell?

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Philipp G. schrieb:
> Ach? Diffie Hellman wäre eine Option für Dich, aber asymmetrische
> Verschlüsselung hast Du oben in den Wind geschlagen?

ach... mit den vollen Kryptographie-Experten mag ich mich grad nicht 
rumschlagen, schon gar nicht am Freitag ;-)

von Philipp G. (geiserp01)


Lesenswert?

Michael R. schrieb:
> Philipp G. schrieb:
>> Ach? Diffie Hellman wäre eine Option für Dich, aber asymmetrische
>> Verschlüsselung hast Du oben in den Wind geschlagen?
>
> ach... mit den vollen Kryptographie-Experten mag ich mich grad nicht
> rumschlagen, schon gar nicht am Freitag ;-)

Na, dann danken wir Dir für die wertvollen Tips.

von Kräuterli (Gast)


Lesenswert?

Michael R. schrieb:
> ach... mit den vollen Kryptographie-Experten mag ich mich grad nicht
> rumschlagen, schon gar nicht am Freitag ;-)

Nach deiner Kritik, wie man es nicht machen soll, hätte ich nun 
vermutet, du sagst dank deiner Fach- und Sachkenntnis endlich mal, wie 
man es statt dessen richtig macht. Aber nein, nur heisse Luft und 
Ausflüchte.

Danke für's Gespräch.

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Philipp G. schrieb:
> Na, dann danken wir Dir für die wertvollen Tips.

Kräuterli schrieb:
> Nach deiner Kritik, wie man es nicht machen soll, hätte ich nun
> vermutet, du sagst dank deiner Fach- und Sachkenntnis endlich mal, wie
> man es statt dessen richtig macht. Aber nein, nur heisse Luft und
> Ausflüchte.

ich glaub es ja nicht... und ich wiederhole mich:

Michael R. schrieb:
> Was ist denn mit euch los? schlecht geschlafen? Freitag?
>
> Das Problem ist kein triviales; und ich habe mir erlaubt darauf
> hinzuweisen dass triviale Lösungen nicht unbedingt zielführend sind...

[ ] Philipp kennt den Unterschied zwischen symmetrischer/asymmetrischer 
Verschlüsselung und (DH-) Schlüsselaustausch

Für "wie macht mans richtig" fehlen ein paar wesentliche Infos (welcher 
Kommunikationskanal? Kabel? IP? UART? Funk? WLAN? Ist MITM ein Szenario? 
Muss nur Kommunikation sicher sein, oder auch der Client? ...)

Für "wie macht mans falsch" sind genügend Infos vorhanden... und 
offensichtlich genügend "Experten"

von Kräuterli (Gast)


Lesenswert?

Michael R. schrieb:
> Für "wie macht mans falsch" sind genügend Infos vorhanden...

Aber die Frage vom TO hast du gelesen? ;-)

Ekkehard D. schrieb:
> Jetzt möchte ich eigentlich nicht, dass im Quelltext irgendwo der
> Schlüssel zu sehen ist,

Nochmal: Er schrieb "im Quelltext"!

von wendelsberg (Gast)


Lesenswert?

Michael R. schrieb:
> Für "wie macht mans richtig" fehlen ein paar wesentliche Infos (welcher
> Kommunikationskanal? Kabel? IP? UART? Funk? WLAN?

Ist das nicht der Sinn von Verschluesselung, dass das danach egal ist?

wendelsberg

von Alex G. (dragongamer)


Lesenswert?

Eine sehr einfache und wenig technische Lösung für das Dilemma wäre 
folgende:
Während der Produktion immer mit einem wertlosen Schlüssel aka 012345 
arbeiten. Das PC Programm zeigt beim Start dann immer eine Message 
"Achtung, Testschlüssel wird verwendet!".
Erst in dem Auslieferungsbuild wird dann der richtige Schlüssel 
eingetippt und sichergegangen dass die Message nicht mehr erscheint.

Die professionelle Lösung ist in der Tat ein asymetrisches 
Schlüsselaustauschverfahren wie Diffie Hellman z.B.
Nachteil ist dass dies etwas rechenkapazität auf dem Mikrocontroler 
erfordert und die Implementation nicht grad ohne ist. Vieleicht gibt es 
aber bereits eine nutzbarer Library die auf eurem Gerät kompilierbar 
ist!

: Bearbeitet durch User
von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

wendelsberg schrieb:
> Ist das nicht der Sinn von Verschluesselung, dass das danach egal ist?

Je nach Anforderung macht es einen Unterschied ob man ein "shared 
medium" nutzt.

von Stefan F. (Gast)


Lesenswert?

Manche Geräte laden ihre Schlüssel von Chipkarten und werden ggf. in 
bewachte Käfige gestellt.

Beitrag #5327191 wurde vom Autor gelöscht.
von Philipp G. (geiserp01)


Lesenswert?

Die heißen Hsm. Unsere löschen sich wenn man laut hustet.

Aber nochmal zum Thema:

 -starke- Verschlüsselung ist IMHO nich gefordert, sondern lediglich 
Verschleierung des keys im source.

von Huh (Gast)


Lesenswert?

Stefan U. schrieb:
> bewachte Käfige

Hilft das, um den Schlüssel im Quelltext zu verstecken? ;-)

von Ekkehard D. (ekkehard)


Lesenswert?

Vielen Dank für die Ideen und Hinweise.
Eine asymetrische Verschlüsselung ist mir zu aufwendig, zumal dann das 
Problem mit dem privaten Schlüssel im Quelltext der Firmware, bzw im 
HEX-File, immer noch bleibt.

Die Idee einen ID-Wert aus dem Zielsystem zu verwenden um damit den 
Schlüssel zu verändern gefällt mir dagegen gut, u.a. weil so ein Wert 
tatsächlich zur Verfügung steht. Wie gut der sich tatsächlich eignet 
muss noch ergründet werden, es ist kein zufälliger Wert.

Was mir daran nicht gefällt ist folgendes:
- Entweder muss auf der PC-Seite für jedes Gerät ein Schlüssel 
vorgehalten werden. Zusätzlich muss man dann auch wissen mit wem man 
gerade redet.
- Oder, falls man den ID-Wert hernimmt um den globalen Schlüssel zu 
dekodieren, jedes Gerät eine spezielle Fimware benötigt. Ggf. lässt sich 
das aber mit einer geschickten externen Manipulation des HEX-Files oder 
einem geeigneten Include oder Linker-Script elegant(er) lösen.

Das Ziel aber, dass jemand der das Hex-File oder den Quelltext in die 
Hände bekommt nicht durch bloßes hinschauen, bzw. durch Simulation und 
Debuggen den Schlüssel herausfindet wäre gegeben.

Gruß Ekkehard

von Schreiber (Gast)


Lesenswert?

Ganz einfach:
Das Elektronik-Gerät bekommt ein kleines Display. Auf diesem generiert 
es einen Schlüssel, der bei der ersten Verbindung mit einem bestimmten 
Computer in diesem eingegeben werden muss.

Neuer Computer oder andere Baugruppe = neuer Schlüsselaustausch

von Stefan F. (Gast)


Lesenswert?

Neben dem Quelltext gibt es noch andere Möglichkeiten, Schlüssel zu 
hinterlegen. Die gute alte Chipkarte nannte ich bereits. Denkbar wären 
auch SD Karten oder EEproms, gerne auch im µC integriert.

von Sebastian S. (amateur)


Lesenswert?

Bei vielen µP ist es möglich den Speicher vor dem Auslesen zu schützen.

Mag ja sein, dass das nicht der Weisheit letzter Schluss ist, aber in 
den meisten Fällen ist das ausreichend.

Hilft natürlich nicht bei der Bewahrung von Staatsgeheimnissen. Aber wer 
besitzt die schon?

von Alex G. (dragongamer)


Lesenswert?

Ekkehard D. schrieb:
> Vielen Dank für die Ideen und Hinweise.
> Eine asymetrische Verschlüsselung ist mir zu aufwendig, zumal dann das
> Problem mit dem privaten Schlüssel im Quelltext der Firmware, bzw im
> HEX-File, immer noch bleibt.
Glaube du weisst nicht so ganz was asymetrische Verschlüsselung 
bedeutet!
Der private schlüssel wird nicht einmal generiert, sondern jedes mal 
wenn sich der Controler mit dem PC verbindet!
Jede Verbindung verwendet dann einen anderen, privaten Schlüssel. 
Gespeichert wird er dann nur im Ram und bei Abschaltung somit gelöscht.

Der Trick sind die berühmten Falltürfunktionen die man in einer Richtung 
sehr schnell ausrechnen kann, rückwärts aber extrem langsam.
Darum kann auch jemand der den Übertragungsweg komplett abhört, nicht 
den generierten, privaten Schlüssel ermitteln.


Anderserseits:
Haben andere leute in eurem Team, Ahnung von Software-Security?
Wenn nämlich nicht, dann wird die PC-Software selbst garantiert der 
deutlich einfacher zu knackende Weg für einen Angreifer sein...
Bzw. der wird nicht darauf warten müssen, dass bei euch irgendwas leakt.

: Bearbeitet durch User
von Ekkehard D. (ekkehard)


Lesenswert?

Alex G. schrieb:
> Glaube du weisst nicht so ganz was asymetrische Verschlüsselung
> bedeutet!

Also ein Client der einen Server kontaktieren will, nimmt dessen 
öffentlichen Schlüssel und verschlüsselt mit ihm eine Nachricht, die 
einen symetrischen session-key enthält. Diese Nachricht kann der Server 
mit seinem privaten Schlüssel entschlüsseln.
Der Server benötigt also ein Schlüsselpaar bestehend aus öffenlichem und 
privatem Schlüssel.

Wenn mein Mikrocontroller einen solchen Server darstellt, benötigt er 
einen privaten Schlüssel und muss ihn entsprechend vorhalten.

Gruß Ekkehard

von Alex G. (dragongamer)


Lesenswert?

Gut, das ist richtig, aber das ist nur eines der möglichen Verfahren.
Das ist das Konzept welches man im Web verwendet wo man verlässliche 
Drittanbieter für den public key hat. Das wäre in eurem Fall aber nicht 
der richtige Ansatz, da für "Man in the middle" angreifbar wenn es nur 2 
Parteien gibt!

Hier eine Erklärung zum bereits mehrfach erwähnten Diffie Hallman 
welcher perfekt für euer vorhaben ist: 
https://www.elektronik-kompendium.de/sites/net/1909031.htm

P.s. schaut mal ob diese library auf eurem Mikrocontroler kompilierbar 
ist: https://github.com/jedisct1/libhydrogen

: Bearbeitet durch User
von oszi40 (Gast)


Lesenswert?

Ekkehard D. schrieb:
> und muss ihn entsprechend vorhalten.

... und dafür möchtest Du ihn im Quelltext verstecken..? Manche 
Bank-Schließfächer brauchen 2 Schlüssel. Erzeuge 100 Schlüssel, die 
keiner braucht und beschrifte sie überzeugend. Bis die alle 
durchprobiert sind ist Feierabend. Steganographie ist die Kunst der 
verborgenen Speicherung.

von S. R. (svenska)


Lesenswert?

Ich stimme einigen Vorpostern zu und schlage vor:
Schreibe einen bekannte Testschlüssel in deinen Quelltext. Ein 
Controller, der nur diesen Schlüssel hat, verweigert den eigentlichen 
Dienst, bis ihm vom PC ein neuer Schlüssel zugewiesen wurde. Diesen 
schreibt er in sein EEPROM oder Flash (und, wenn das kein Problem ist, 
löscht ihn bei Werksreset wieder).

Damit kannst du vom PC aus neuen Geräten einmalig einen neuen Schlüssel 
zuweisen. Ob der Schlüssel nun pro Gerät verschieden oder immer gleich 
ist (oder für je 5 Geräte gleich) ist, entscheidet das PC-Programm. 
Letzteres kannst du besser aktualisieren als die Firmware des 
Controllers. Weder PC-Programm noch Controller-Quelltext enthalten den 
Schlüssel.

Kryptographie löst keine Probleme, sie macht aus den Problemen nur 
Schlüssel-Management-Probleme.

Für deine Ursprungsfrage: Ja, das kannst du machen, ist aber nicht 
unbedingt sicher. Hier zwei Ansätze:

a) In deiner Firmware deklarierst du ein (leeres) Array passender Größe 
im Flash und generierst deine Hex-Datei. Ein weiteres Programm liest - 
möglicherweise nach Passworteingabe - aus der ELF- oder MAP-Datei die 
genaue Adresse des Arrays aus und trägt den Schlüssel dann an passender 
Stelle in die Hex-Datei ein oder generiert eine neue Hex-Datei.

b) Du gibst dem Compiler den zu verwendeten Schlüssel auf der 
Kommandozeile mit (-DKEY=....). Dann steht der Schlüssel zwar im 
Makefile (bzw. in den Projekteinstellungen), aber immerhin nicht im 
Quelltext. Das wäre die vermutlich einfachste Variante.

von Ekkehard D. (ekkehard)


Lesenswert?

Guten Morgen und nochmals Danke an alle die sich beteiligt haben.
Das es keinerlei Bedenken hinsichtlich der Lösung auf der PC-Seite gab 
(Schlüssel ist durch Passphrase verschlüsselt in Datei/Datenbank etc. 
gespeichert), bietet sich an, dies auch auf der Mikrocontroller-Seite so 
zu handhaben.
Ich werde also (sehr wahrscheinlich) einen Schlüssel für alle Systeme 
verwenden. Im Quelltext wird der Platz für den Schlüssel mit einem Dummy 
gefüllt sein, der Wert im HEX-File wird erst kurz vor dem Programmieren 
des Zielsystems durch ein anderes Programm gepatcht werden. Dieses Feld 
wird zudem nur den Schlüssel in verschlüsselter Form enthalten. Das 
Passwort zum entschlüsseln wird dann eine Geräteabhängige ID sein.
Somit enthält kein Quelltext einen Schlüssel, der unwahrscheinliche 
Verlust eines gepatchten HEX-Files kompromitiert ebenfalls nicht den 
Schlüssel, denn er ist ähnlich gesichert wie der Schlüssel auf der 
PC-Seite.

Das Einspielen eines neuen Schlüssels (auch einmalig nach 
Erstinstallation) auf dem Zielsystem finde ich eher ungünstig, denn dann 
könnte versehentlich oder absichtlich der Schlüssel so geändert werden, 
dass der tatsächliche Besitzer ausgesperrt ist. Besser erscheint mir, 
dass der Schlüssel unveränderbar in der schreibgeschützen Firmware zu 
liegen kommt.

Eine schöne Woche!
Gruß Ekkehard

von A.. P. (arnonym)


Lesenswert?

Michael R. schrieb:
> Für "wie macht mans richtig" fehlen ein paar wesentliche Infos (welcher
> Kommunikationskanal? Kabel? IP? UART? Funk? WLAN? Ist MITM ein Szenario?
> Muss nur Kommunikation sicher sein, oder auch der Client? ...)

Kann mich einem Vorposter nur anschließen: Verschlüsselung sollte es 
eben unnötig machen genau die von dir genannten Punkte in Betracht zu 
ziehen. MITM ist in den meisten Fällen ein mögliches Szenario, wo 
Informationen über eine ausreichend große Strecke - und damit meine ich 
jetzt nicht von Controller A zu Controller B über 2 cm Leiterbahn auf 
derselben Platine - über ein beliebiges Medium übertragen werden. Dass 
der Client auch sicher sein sollte, ergibt sich irgendwie aus der 
Problemstellung - du baust dir doch auch keine Stahltür ins Haus, die 
365 Tage im Jahr offen steht, oder?

Michael R. schrieb:
> wendelsberg schrieb:
>> Ist das nicht der Sinn von Verschluesselung, dass das danach egal ist?
>
> Je nach Anforderung macht es einen Unterschied ob man ein "shared
> medium" nutzt.

Dafür, dass dir angeblich so notwendige Informationen fehlen, 
verwirbelst du das Thema hier immer wieder mit unnötigen Infos und 
trägst aber keine konkrete Lösungsidee vor.

@TO:
Normalerweise ist das die erste Frage bei so einem Thema, daher wundert 
es mich, dass sie so noch niemand hier gestellt hat, aber: Was ist denn 
das für ein System bzw. welcher Controller wird eingesetzt? Und kannst 
du etwas präziser erläutern, wann die Konfiguration des 
Kommunikationsschlüssels frühestens zu erfolgen hat?
Wie ein Vorposter bereits erwähnt hatte, könnte man ja einfach den 
Leseschutz für einen bestimmten Bereich des Flash aktivieren, und somit 
ungewolltes Auslesen verhindern. Das sollte z.B. mit allen STM32 möglich 
sein. Einfach im Linker-Skript mitteilen, dass eine bestimmte Flash-Page 
für den Code tabu ist, da dort der Schlüssel abgelegt und anschließend 
vom Auslesen geschützt wird. Dann kann man im Code einfach so etwas wie

1
#define KEY_ADDRESS 0x08000000

schreiben und überall dort, wo der Schlüssel benötigt wird, einfach mit 
der Adresse darauf zugreifen und niemand sonst kennt den Inhalt. Ist das 
eine Option?

Gruß
Arno

: Bearbeitet durch User
von Ekkehard D. (ekkehard)


Lesenswert?

A.. P. schrieb:
> @TO:
> Normalerweise ist das die erste Frage bei so einem Thema, daher wundert
> es mich, dass sie so noch niemand hier gestellt hat, aber: Was ist denn
> das für ein System bzw. welcher Controller wird eingesetzt? Und kannst
> du etwas präziser erläutern, wann die Konfiguration des
> Kommunikationsschlüssels frühestens zu erfolgen hat?

Da dass System das meines Kunden ist, kann und will ich da nicht 
allzuviel verraten.
Aber das System wird nach der Produktion vergossen und ins Lager gelegt 
und dann ausgeliefert. Anschließend ist es für Jahre "unterwegs".
Die Erstprogrammierung erfolgt noch vor dem Vergießen, da kommt dann ein 
Bootloader rein, der es ermöglicht später die (erweiterte) Firmware 
einzuspielen. Der Kommunikationskanal ist das Internet via einem 
GSM-Modem, also alles ziemlich offen.
Es ist also wichtig die Kommunikation zu schützen. Zum einen um den 
Eintrag von Schadcode zu verhindern, zum anderen aber auch um die 
Kundendaten des laufenden Betriebs zu sichern.
Anlass des Threads, bzw. der Frage, ist das Design des Bootcodes. Da 
hier eben im laufenden Betrieb keine Änderungen mehr möglich sind, bin 
ich über Hinweise ziemlich dankbar.
Zur zweiten Frage. Es lassen sich Bereiche des Flashspeichers sperren 
und ich werde das benutzen um den Bootcode zu schützen, aber leider ist 
das nicht so flexibel möglich, wie in anderen Systemen.
Die Erfahrungen werden dann alle in ein neues HW-Design fließen :-)
Gruß Ekkehard

von Egon N. (egon2321)


Lesenswert?

Ekkehard D. schrieb:
> Es ist also wichtig die Kommunikation zu schützen. Zum einen um den
> Eintrag von Schadcode zu verhindern, zum anderen aber auch um die
> Kundendaten des laufenden Betriebs zu sichern.

Das ist nunmal nicht möglich sofern physikalischer Zugriff auf die 
Hardware gegeben ist.

Es gibt dafür aber teils eingebaute Lösungen in µC für exakt dieses 
Problem, eine asym. Verschlüsselung ist dabei nur eine Möglichkeit. 
Manche µC bieten einen speziellen geschützten Speicherbereich. Aber 
spätestens beim Rechner dürftest du verloren haben.

von A.. P. (arnonym)


Lesenswert?

Ekkehard D. schrieb:
> Da dass System das meines Kunden ist, kann und will ich da nicht
> allzuviel verraten.

Brauchst du auch nicht, ich wollte ja nicht wissen, ob du das für's 
Militär oder nur für den lokalen Bingoverein entwickelst :P Aber eine 
Controller-Bezeichnung wäre doch noch sehr hilfreich, einfach damit man 
mal selber einen Blick ins Datenblatt werfen kann. Vielleicht findet man 
ja noch einen nützlichen Weg. ich kann mir nämlich gerade schlecht 
vorstellen, dass dein Controller flexibel genug ist, um den Bootloader 
vor dem Auslesen zu schützen, aber man diesen geschützten Bereich nicht 
noch um 20-30 Byte für den Schlüssel erweitern kann.

Und weil du gerade vom Bootloader sprachst: Handelt es sich bei dem 
Schutz des Schlüssels nun um den Bootloader oder den Anwendungscode? Ich 
habe das noch nicht ganz verstanden.

Und noch was: Ich weiß ja nichts über die Brisanz dieser Kundendaten 
oder die Größenordnung dieses Systems, aber wenn du tatsächlich vor 
hast, ein und denselben Schlüssel auf ALLE Systeme zu verteilen

Ekkehard D. schrieb:
> Ich werde also (sehr wahrscheinlich) einen Schlüssel für alle Systeme
> verwenden.

würde ich mir an deiner Stelle doch etwas mehr Gedanken über einen 
stärkeren Schutz bzw. ein anderes Konzept machen. Wenn die Kundendaten 
gerade so (un)wichtig sind, dass nicht jeder Hans Wurst mitkriegen soll, 
was da so für Daten durch die Luft fliegen, davon aber auch kein 
Menschenleben abhängt, kann das so ausreichen, wie du dir das 
vorstellst.
Wenn sich an der Wichtigkeit der Daten aber mal was ändern sollte, was 
du ja im Nachgang nicht mehr beeinflussen kannst, dann hast du mit 
deinem Konzept einem potenziellen Angreifer gleich n Einfallstore für 
einen möglichen Angriff gegeben. Und trotz des Einsatzes von bewährten 
Krypto-Bibliotheken in der Client-Software oder eines Ausleseschutzes 
auf dem Controller: Es gibt bekanntlich keine 100%-ige Sicherheit und 
nichts ist für die Ewigkeit.
Da würde ich mich dann nicht auf ein einfaches Passwort verlassen, was 
maximal irgendwo von einer Geräte-ID abhängt und an einer bestimmten 
Stelle im Flash liegt und vor dem Auslesen geschützt ist - vorerst. Und 
von irgendwelchem selbstgefrickelten Verschleierungscode, der an 
"unvorhersehbaren" Stellen irgendeine schwarze Magie anwendet, oder gar 
"Pseudo-Hashfunktionen", wie es hier jemand aufgeführt hat, wollen wir 
erst gar nicht reden.

Ich will jetzt hier nicht alle möglichen Szenarien ausmalen und 
durchkauen, das musst du natürlich selbst abwägen und entscheiden. Aber 
vielleicht sparen dir diese Überlegungen im Zweifelsfall in Zukunft sehr 
viel Änderungsaufwand und die Erkenntnis "Ach hätte ich mich damals 
besser für den (etwas) komplizierteren Weg entschieden..."

Gruß
Arno

P.S.: Noch ein Nachwort zu der Aussage eines Vorposters, man könne ja 
den Schlüssel an "unvorhersehbaren" Stellen im Code zusammenbauen: In 
den allermeisten Computersystem und somit auch Programmiersprachen gibt 
es kein "Unvorhersehbar". Für den Computer ist immer alles vorhersehbar 
- genauer gesagt deterministisch (außer, wenn du deinen Kaffee über die 
Tastatur gießt). Sonst wüsste der Prozessor nicht, welcher Task als 
nächstes läuft und du wüsstest nicht, ob dein Rechner nun startet oder 
nicht. Hat alles etwas mit endlichen Automaten zu tun und damit, dass so 
ziemlich alle Programmiersprachen, Compiler und alles was eben damit 
zusammenhängt darauf zurückzuführen sind. Könntest du also ein 
"unvorhersehbares" Programm schreiben, so müsstest du auch einen 
Compiler haben, der dir ein unvorhersehbares Ergebnis ausspuckt, bei dem 
dann aber unvorhersehbar ist, wie groß es ist und wie lange es überhaupt 
läuft. Und da so viele Unvorhersehbarkeiten schon im echten Leben 
scheiße sind, will man sowas erst gar nicht in einem technischen System 
haben :)
Somit wären also die Stellen, an denen so ein Passwort zusammengebaut 
oder verwürfelt wird, für den Menschen scheinbar unvorhersehbar, aber 
für ein entsprechendes Programm wären diese Stellen sehr wohl 
vorhersehbar und mit dem nötigen Aufwand müsste sich ein Angreifer dann 
nur noch an diesen Stellen einklinken und dein Passwort auslesen.

: Bearbeitet durch User
von Ekkehard D. (ekkehard)


Lesenswert?

A.. P. schrieb:
> ich kann mir nämlich gerade schlecht
> vorstellen, dass dein Controller flexibel genug ist, um den Bootloader
> vor dem Auslesen zu schützen, aber man diesen geschützten Bereich nicht
> noch um 20-30 Byte für den Schlüssel erweitern kann.

Man kann einen Bereich festlegen der gesperrt ist. Der kann natürlich so 
groß sein, wie er sein muss. Ich schrieb ja, dass ich den Schlüssel dann 
ins HEX-File eintragen will.


> Und weil du gerade vom Bootloader sprachst: Handelt es sich bei dem
> Schutz des Schlüssels nun um den Bootloader oder den Anwendungscode? Ich
> habe das noch nicht ganz verstanden.


Ich denke nur für den Bootloader, denn die Kunden werden wohl ihre Daten 
selbst in ihrer Hand halten wollen. Das führt dann dazu, dass diese 
Kundenschlüssel im EEProm bzw. im ungeschützten Flash liegen werden.
Also konzentriere ich mich zunächst mal auf den Bootloader.

> Und noch was: Ich weiß ja nichts über die Brisanz dieser Kundendaten
> oder die Größenordnung dieses Systems, aber wenn du tatsächlich vor
> hast, ein und denselben Schlüssel auf ALLE Systeme zu verteilen
> würde ich mir an deiner Stelle doch etwas mehr Gedanken über einen
> stärkeren Schutz bzw. ein anderes Konzept machen.

Die Frage mit dem Schlüssel ist ein Dilemma.
Fall A: Ein Schlüssel für alle Geräte. Dann würde es auch nur eine Datei 
mit Softwareupdate geben die mit diesem Schlüssel verschlüsselt ist.
Fall B: Je ein Schlüssel pro Gerät. Dann müsste es für jedes Gerät 
jeweils eine Datei mit dem Softwareupdate passend für dieses Gerät 
geben.

In Fall A wird die Kompromitierung des Schlüssels dazu führen, dass alle 
Geräte offen stehen. Allerdings ist anhand der wenigen Daten ein Angriff 
auf den Schlüssel schwierig.
In Fall B kann aber die Masse der Daten mit dem gleichen Inhalt (vor 
Verschlüsselung) dazu führen, das die Schlüssel viel leichter zu 
kompromitieren sind.

> Wenn die Kundendaten
> gerade so (un)wichtig sind, dass nicht jeder Hans Wurst mitkriegen soll,
> was da so für Daten durch die Luft fliegen, davon aber auch kein
> Menschenleben abhängt, kann das so ausreichen, wie du dir das
> vorstellst.

Das ist eine sehr gute Frage. Dinge an denen unmittelbar Menschenleben 
hängen, mache ich grundsätzlich nicht :-)
Das System soll verantwortlich mit den Daten umgehen, ich erwarte 
eigentlich keinerlei Angriffe, denn bisher (ohne Bootloader!) ist alles 
sehr offen und es hat sich nie jemand beschwert. E-Mails gehen z.B. ja 
auch überwiegend unverschlüsselt durchs Netz und nur selten ist was 
Verfälschtes dabei.
Ich denke aber, dass man die Haustüren nicht offenstehen lassen sollte, 
die Vermeidung der "Verleitung zum Kameradschaftsdiebstahl" steht an 
erster Stelle.

von S. R. (svenska)


Lesenswert?

Ekkehard D. schrieb:
> Dieses Feld wird zudem nur den Schlüssel in verschlüsselter
> Form enthalten. Das Passwort zum entschlüsseln wird dann
> eine Geräteabhängige ID sein.

Naja, wenn du einen Schlüssel für alle Geräte benutzen möchtest, um eine 
Firmware-Datei auf allen Geräten einspielen zu können, dann bringt es 
nur wenig, diesen Schlüssel auch noch zu verschlüsseln.

Es macht technisch keinen Unterschied, ob du den Schlüssel so ins Flash 
legst, oder ob du ihn verschlüsselst und alle nötigen Informationen 
danebenlegst. In beiden Fällen hast du die Informationen, wie man an den 
Schlüssel kommt, im Quelltext stehen (nur den Schlüssel selbst nicht).

Ekkehard D. schrieb:
> In Fall A wird die Kompromitierung des Schlüssels dazu führen, dass alle
> Geräte offen stehen. Allerdings ist anhand der wenigen Daten ein Angriff
> auf den Schlüssel schwierig.

Ein externer Angreifer wird bevorzugt den Upgrade-Mechanismus angreifen, 
also den Schlüssel aus dem Updater selbst extrahieren. Die Frage ist, 
wogegen du dich schützen möchtest.

von Philipp G. (geiserp01)


Lesenswert?

A.. P. schrieb:
> P.S.: Noch ein Nachwort zu der Aussage eines Vorposters, man könne ja
> den Schlüssel an "unvorhersehbaren" Stellen im Code zusammenbauen: In
> den allermeisten Computersystem und somit auch Programmiersprachen gibt
> es kein "Unvorhersehbar".

Das ist mir schon klar. Wir arbeiten hier mit HSMs und True Random 
Generatoren. In der Natur ist nix zufällig ausser kosmische 
Hintergrundstrahlung.

Da der TO anfangs nur von 'Passwort im Quellcode verschleiern' 
gesprochen hat, und dann plötzlich mit 'Reverse Engineering 
verhindern/debugging' geschrieben hat, habe ich mich aus dem Thread 
ausgeklinkt.

Ohne die Anforderungen genau zu kennen ist es hier sehr schwierig die 
optimale Lösung vorzuschlagen.

von Chris S. (aaa)


Lesenswert?

Bootloader, der macht einen Checksum über die Flash und wenn diese nicht 
stimmt, dann wird der Code nicht ausgeführt.
Bei verschlüsseltem Bootloader wird verschlüsselt die Checksum 
runtergeladen, zusammen
mit einer seed und einer Auth-ID sowie einem Flag und eventuellem 
firmware-id.
Die Auth-id muss stimmen. Seed wird mit einem LFRS generator als random 
number genutzt,
je nach Flag wird vorher ein Xor mit der UID oder SID gemacht, bzw auch 
die
daten mit dem Inhalt des Flashes mittels crypto verschluesselt bzw auch 
die
bits einfach ge"shuffled".
Je nach dem wie die Update-Daten aussehen, ist das system offener oder 
geschlossener, bzw lassen sich alle Controller, oder nur einige, bzw ein 
einziger updaten. Auch wird das reverse engeenering des Keys über valid 
Opcodes
erschwert.

von oszi40 (Gast)


Lesenswert?

Man sollte stets Aufwand und Nutzten im Verhältnis sehen. Ein Dieb klaut 
lieber das unangeschlossene Rad als eins mit 7 Schlössern angeschlossen. 
Wenn allderdings der Besitzer sich SELBST ausgesperrt haben sollte wird 
es knifflig! z.B. Zertifikate haben Verfallszeiten...
S. R. schrieb:
> Ein externer Angreifer wird bevorzugt den Upgrade-Mechanismus angreifen,

Wenn z.B. nur ein Teil des Schlüssels beim Kunden liegt (ID) und der 
Rest erst durch Verarbeitung gelieferter Daten errechnet wird, könnte 
man zwar trotzdem den Cache untersuchen. Macht aber Arbeit!

von Norbert S. (norproz)


Lesenswert?

schon mal über den einsatz von einem DS28CM00 nachgedacht? in der
software auf dem computer müsste dann einfach diese serienummer
"registriert" werden... diese eindeutige identifikation kann auch zur
verschlüsselung verwendet würde.

vorteile:

- man kann devices auch ganz bewusst trennen (verlust, diebstahl)
- da vergossen (und ggf zusätzlichem abschleifen) verschleierbar
- einmaliger code
- günstig


nachteile:

- nur 48 bit (ausser man bohrt den schlüssel irgendwie auf und dann sind
wir wieder beim sourcecode-hack)
- bei "hardcopy" des devices mit der nachgestellten nummer ist das
device in dieser umgebung zu ersetzen.

von Mark (Gast)


Lesenswert?

Philipp G. schrieb:
> Michael R. schrieb:
>> Das kommt der Sache schon näher...
>
> Ach? Diffie Hellman wäre eine Option für Dich, aber asymmetrische
> Verschlüsselung hast Du oben in den Wind geschlagen?

Diffie-Hellman ist symmetrisch, nicht asymmetrisch. Im Prinzip ist es 
aber egal, da der TO nichts Richtiges will.

von Horst (Gast)


Lesenswert?

Hallo Ekkehard,

der Entwickler einer Programmiersuite für AVRs hatte dazu vor einiger 
Zeit eine ziemlich coole Lösung für ein solches Problem:

Die Controller die ihre Kommunikation untereinander austauschen lauschen 
gemeinsam an einem offenen ADC o.Ä. und generieren sich aus dem 
untersten, springendem Bit durch Bitsammeln synchronisiert einen 
Schlüssel beliebiger Länge. Dieser Schlüssel wird dann zur 
Kommunikationsverschlüsselung verwendet. Das Ganze kann entweder bei der 
Initialisierung/vor Auslieferung oder bei jedem Start erfolgen und/oder 
in gewissen Zeitabständen automatisiert aufgefrischt werden. Mit einer 
entsprechenden Beschaltung lässt sich Ggf. auch erkennen, ob am 
entsprechenden Pin gelauscht oder manipuliert wird und den Betrieb 
sperren.

Die Beschreibung müsste ausreichen, wenn gewünscht kann ich aber nochmal 
nach dem Link zum Artikel schauen (Luna Studio für AVR)


Gruß, Horst

von Sheeva P. (sheevaplug)


Lesenswert?

Ekkehard D. schrieb:
> ich bin dabei ein Pärchen aus einer Mikrocontroller-Firmware und einer
> PC-Software zu bauen, deren Kommunikation verschlüsselt ablaufen muss.
> Der hierzu notwendige gemeinsame Schlüssel (die Verschlüsselung ist
> symetrisch) muss logischerweise zur Laufzeit dem Programm zur Verfügung
> stehen.
> Jetzt möchte ich eigentlich nicht, dass im Quelltext irgendwo der
> Schlüssel zu sehen ist, denn dann ist die Chance groß, dass zufällig
> oder fahrlässig der Schlüssel mal irgendwohin kopiert wird.

Ohne es getestet zu haben, würde ich den Schlüssel in eine Datei namens 
"secretkey.h" schreiben, etwa so:
1
#define SECRETKEY "ici le clef"

Die Datei wird dann mit
1
gpg --encrypt-files -r hab@ich.net secretkey.h

per GnuPG verschlüsselt, heraus kommt die Datei "secretkey.h.gpg" und 
"secretkey.h" kann dann gelöscht werden. Mit dem Schalter "-r" wird 
angegeben, welche(r) Empfänger die Datei entschlüsseln, mithin: die 
Software übersetzen können soll(en). Der Schalter kann auch mehrmals 
angegeben werden, wenn das mehrere Kollegen sein können. Von denen muß 
natürlich jeder ein GPG-Schlüsselpaar besitzen, das von demjenigen, der 
"secretkey.h.gpg" erzeugt, importiert werden muß.

Im Makefile wird dann vor dem Übersetzen der .c-Datei, die den Schlüssel 
einbindet, mit
1
gpg --decrypt-files secretkey.h.gpg

wieder die originale "secretkey.h" erzeugt, dann die betreffende 
.c-Datei übersetzt, und "secretkey.h" danach wieder gelöscht.

Problematisch kann das nur werden, wenn es mit einer IDE übersetzt wird, 
also das Makefile von der IDE aufgerufen wird. Keine Ahnung, ob und wie 
GnuPG dann nach der Passphrase des Kompilierenden fragen kann. Da muß 
man (ggf. in einem eigenen Unterverzeichnis) eventuell vorher die 
Objektdatei der obengenannten .c-Datei per Kommandozeile erzeugen.

von Sheeva P. (sheevaplug)


Lesenswert?

Alex G. schrieb im Beitrag #5327302
> Der private schlüssel wird nicht einmal generiert, sondern jedes mal
> wenn sich der Controler mit dem PC verbindet!
> Jede Verbindung verwendet dann einen anderen, privaten Schlüssel.

Entschuldige, aber Du verwechselst hier die privaten Schlüssel des 
Schlüsselpaares mit dem symmetrischen Session-Schlüssel, der mit den 
öffentlichen Schlüsseln zweier Schlüsselpaare ausgehandelt wird.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.