INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 1 Bewertungen - 5 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Sichere Übertragung mit NRF24
16.03.2014, 20:20 (Dieser Beitrag wurde zuletzt bearbeitet: 16.03.2014 20:30 von itsy.)
Beitrag #1
Sichere Übertragung mit NRF24
Hallo zusammen,

ich steuere über NRF24L01 als Funkanbindung diverse Clients (Homeautomation).

Da u.a. das Schalten von Verbrauchern, sowie eine Alarmanlage damit realisiert ist, wäre es natürlich wichtig, wenn nicht jeder, der den Code bestitzt, vor meiner Wohnung stehen kann, um das Licht einzuschalten Link.

Meine Frage ist nun, wie ich beispielsweise den Befehl zum Schalten eines Verbrauchers "absichern" kann. Aktuell könnte jeder mit dem Code den Broadcast empfangen und damit dann die Clientnummern zum Steuern der Systeme erhalten.

Ich denke nicht, dass die Bezeichnung der Pipes als Absicherung ausreicht, oder?

Vielen Dank
itsy

Kleiner Nachtrag: Es geht dabei nicht darum die Verbindung zu verschlüsseln, sondern nur darum sicherzustellen, dass der Client nur auf die Befehle von meinem Master reagiert, also eine Art Authentifizierung.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.03.2014, 08:07 (Dieser Beitrag wurde zuletzt bearbeitet: 17.03.2014 08:33 von rkuehle.)
Beitrag #2
RE: Sichere Übertragung mit NRF24
Moin itsy,

dem NRF24L01 ist es ja erstmal egal was er überträgt/empfängt. Der Chip/Modul sendet/empfängt Inhalte und hofft darauf, dass die vor-/nachgeschaltete Logik (der Arduino samt Code) was damit anfangen kann.
Also kanns nur darum gehen den Code so zu schreiben, dass er die Daten ver-/entschlüsselt und gleichzeitig bei "Codeklau" nicht der Schlüssel ermittelt werden kann. Folglich ist es ein Problem der Schlüsselverteilung ohne diesen im Code zu hinterlegen, sondern separat auf dem RX / TX zu hinterlegen.
Entweder man macht das über Schlüsseldateien (auf einer SD-Karte auf beiden Seiten? ) oder man schreibt sich eine kleine Eingaberoutine, die den Schlüssel im EEPROM des Arduino ablegt. Der Code muss dann den Schlüssel beim Start von Karte oder EEPROM holen und damit die RX/TX-Befehlsfolgen ver-/entschlüsseln.

So würde über den Broadcast zwar zu sehen sein, dass da Traffic existiert, auch von wo nach wo, aber nicht was übertragen wird.

So könnte es gehen ( glaube ich Huh )

Hope it helps!

Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.03.2014, 17:13
Beitrag #3
RE: Sichere Übertragung mit NRF24
Hallo Ricardo,

hab vielen Dank - das Prinzip habe ich soweit verstanden :-)

Jetzt geht es allerdings an die Umsetzung!

Der Master sendet einen Broadcast mit einer Anfrage oder einem Befehl an alle Clients. Dabei wird ein Array gesendet, welches u.a. eine Clientnummer enthält. Die Clientnummer ist einem Client und einer Funktion zugeordnet und so auch im Code vom Client hinterlegt.

Beispiel (vereinfachte Darstellung, ohne auf die Variablentypen und weiter Funktionen Rücksicht zu nehmen):

Master sendet Array als Broadcast: 12345 0 0 0 0

Die Clientnummer 12345 ist für eine Temperaturabfrage hinterlegt.
Der Client auf dem diese Nummer eingetragen ist antwortet dann mit:

12345 22.5 45 - also seiner Clientnummer Grad in Celsius und Luftfeuchte

Ähnlich funktioniert das auch mit dem Alarm und dem Schalten von Verbrauchern - das Beispiel ist aber schneller zu erklären :-)
Somit kann ich trotz "nur" 6 Pipes beliebig viele Clients ansprechen.

Wie gehe ich nun weiter vor?

Viele Grüße
Thorsten
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.03.2014, 19:06
Beitrag #4
RE: Sichere Übertragung mit NRF24
Hallo itsy,

ich muss mich erstmal für dein sehr eindeutiges Beispiel bedanken. So kann man auch eine (hoffentlich) sinnvolle Antwort geben.
Die Verschlüsselung von Daten (auch im Internet) erfolgt immer nur auf den zu übertragenden Datenstrom selbst, nicht auf Start- oder Zieladresse.
Bei deinem Beispiel:
Zitat:12345 0 0 0 0 - 12345 22.5 45
stellt "12345" im Prinzip die Start-/Zieladresse dar, da ja der Broadcast von den Clients "gefiltert" wird. Das bedeutet dass du nur den Anteil "0 0 0 0" bzw.
"22.5 45" verschlüsseln darfst. Macht auch Sinn, da dies ja die Payload (im Internet der Datenstrom) ist.
In deinem Code müsstest du also die RX/TX - Payload vor dem Senden bzw. nach dem Empfangen durch die Ver-/Entschlüsselungsroutine schicken.
Bei dieser Routine ist deiner Kreativität keine Grenze gegeben. Du hast irgendwo den Schlüssel (EEPROM oder SD-Karte) und ver-/entschlüsselst damit die Payload.
"Ver-/Entschlüsseln" bedeutet hier die Daten mit einem Algorithmus zu verrechnen, der möglichst komplex ist, aber den Arduino nicht in die Knie zwingt.
Bis hierhin nicht wirklich ein Problem.

Die entscheidende Frage ist/bleibt wie du den Schlüssel auf die Arduinos bekommst. Das hängt davon ab was du an Eingabehardware an den Arduinos hast. Du musst ihm ja irgendwie eine Buchstaben-/Zahlenkombi verpassen. Die schlechteste Variante wäre sicher diese in den Code zu schreiben. Es sollte eine Möglichkeit geben, dies über Buttons oä. zu machen.

Wenn du es ganz "cool" machen will, lässt du den "Master" zyklisch einen Schlüssel randomizen und übermittelst ihn dann per Broadcast an die "Slaves". Diesen Schlüssel verschlüsselst du vorher mit einem festgelegten, im EEPROM jedes Arduino gleich hinterlegten Schlüssel. Diesen Schlüssel schreibst du aber nicht per Standardsketch in den EEPROM sondern mit einem getrennten Sketch.

Wie gesagt der Phantasie sind da keine Grenzen gesetzt.
Hier kann man recht verständlich was über Verschlüsselungsalgorithmen lesen:
http://www.fw-1.de/krypto/algorithmen.html

Hope it helps!

Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.03.2014, 20:50
Beitrag #5
RE: Sichere Übertragung mit NRF24
Hallo Ricardo,

vielen Dank für Deine Antwort - ich freue mich auch, dass Du immer noch dabei bist :-)

Deine Anmerkungen habe ich soweit verstanden.

Jetzt erhöhen wir ein wenig den Schwierigkeitsgrad ;-)

Ein Schalter (Client) hat 5 Relais die ein oder ausgeschaltet werden sollen.
Die Verbindung ist natürlich Bidirektional, um auch sicherzustellen, dass der Schalter auch gesetzt ist. Die Relais eines Clients können auf unterschiedlichen Hardwareclients verteilt sein, weil ich ja nicht immer 5 Schalter/ Relais an einem Ort benötige. Daher wird jedes Relais einzeln abgefragt / angesprochen. Programmiert ist, dass er immer alle Relais eines Clients abfragt, wenn ein Client aktiviert ist, als mind. 5 Abfragen. Da ich nicht lange warten möchte, bis etwas geschaltet wird, wird permanent abgefragt. Der Status ist dabei nur ein Bit - 1 oder 0.

Beschränken wir uns also nur auf den Befehl:

12345 3 1

Also der Client 12345 soll das Relais 3 auf 1 (an) schalten

Wenn ich ein Bit verschlüssel und das dann mehrfach in der Minute (ohne Änderung des Schlüssels) identisch über den Äther geschickt wird (ich schalte ja nicht ständig) ist es glaube ich nicht ganz so schwierig den Code zu knacken, sollte man den Arduinocode (ohne Alogorithmus zum verschlüsseln) kennen.

Daher würde ich nun eher dazu tendieren, in einem weiteren Feld des Arrays eine Nummer zur Authentifizierung mitzugeben. Zum einen würde dies grade bei verschiedenen Variablentypen (int, float) weniger Arbeit bedeuten und zum anderen muss ich dann beispielsweise nicht nur ein Bit verschlüsseln.

Dabei müsste sowohl der Client, als auch der Master in der Lage sein zu verschlüsseln. Für einen Schalterstatus und die Temperatur ist das zwar nicht kritisch, aber bei der Frage, ob ein Alarm vom Client gemeldet wird oder nicht schon.

Und wie Du schon richtig geschrieben hast, sollte der Schlüssel auch regelmäßig ausgetauscht werden - grade weil sehr viele Daten immer wieder geschickt werden.
Separate Hardware, wie eine Funkuhr als Hilfsmittel möchte ich nicht in alle Clients zusätzlich einbauen, da dies die Kosten bei der Anzahl nur in die Höhe treiben würde.

Wie gehe ich nun vor ?

Also ich brauche einen Algorithmus zum Verschlüsseln - das ist klar. Der Algorithmus ist statisch im Code von jedem Client und im Master.

Dann brauche ich eine Variable zum Senden von Anfragen / Befehlen vom Master und eine für die Antwort vom Client. Der Master verschlüsselt mit dem Algorithmus die Variable und schickt damit die Anfrage, der Client entschlüsselt die verschlüsselte Variable und wenn diese identisch ist mit dem was im Client hinterlegt ist, gibt es eine Antwort mit einer ebenfalls verschlüsselten Antwort ... den Rest kann man sich denken.

Jetzt steht bei mir noch die Frage nach einem Algorithmus, wie verwende ich damit einen Schlüssel und wie ändere ich den Schlüssel oder die Variable sicher ?

Gibt es hierfür eine Lib? Bei der Suche finde ich immer nur den Rotary Encoder ... ;-)
Außerdem frage ich ziemlich viel in kurzer Zeit ab d.h. die Ver und Entschlüsselung sollte nicht zu lange dauern.

Viele Grüße
itsy
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.03.2014, 21:10
Beitrag #6
RE: Sichere Übertragung mit NRF24
Hallo itsy,

ich muss nochmal sagen: alle Achtung, man merckt dass du dir richtig nen Kopf machst. Klasse..
Du hast ein zusätzliches Thema mit angesprochen:
Zitat:Daher würde ich nun eher dazu tendieren, in einem weiteren Feld des Arrays eine Nummer zur Authentifizierung mitzugeben
Nicht eher, sondern zusätzlich Exclamation
Authentifizierung ist die zweite Hälfte der Verschlüsselung, nach dem Motto: Wer will da überhaupt mit mir sprechen? Ich wußte nur nicht ob du soweit gehen wolltest, und wie oft du Daten hin und her schiebst.
Zitat:sollte man den Arduinocode (ohne Alogorithmus zum verschlüsseln) kennen
Gebe ich dir in jedem Fall Recht, habe ich völlig ausser acht gelassen, dass du den Code ja veröffentlichst.
Hier gibts eine Crypt-/Decrypt-Lib für AES256:
https://github.com/DavyLandman/AESLib
Sie ist leicht in der Anwendung und scheint auch recht schnell zu sein. Um AES256 "aufzumachen" braucht man schon etliches an Rechenpower!

Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.03.2014, 21:11 (Dieser Beitrag wurde zuletzt bearbeitet: 17.03.2014 21:50 von itsy.)
Beitrag #7
RE: Sichere Übertragung mit NRF24
Nachtrag: Ich glaube ich habe die falschen Suchbegriffe gewählt Big Grin Das hier habe ich schon gefunden: klick

Ok, da habe ich den gleichen LInk gefunden, während Du schon gepostet hast. Den werde ich mir jetzt erstmal anschauen. Aber wenn Du schreibst, dass er Rechenpower benötigt, muss ich testen, ob es bei so schnellen Abfragen praktikabel ist. Zudem ist der verschlüsselten Variablen auf die Größe eines int oder float begrenz...

Hi Ricardo,

ok, also ich habe mir die Lib grade angeschaut. Das Data-Array MUSS 16 Bytes groß sein. Der max. Payload mit der NRF24-Lib von maniacbug ist 32 Bytes. Beim Alarm sende ich als Befehl neben der Clientnummer noch 5 weitere Werte als int, also 6 x 2 Bytes (int) = 12 Bytes - sind wir also bei 28 Bytes. Das sollte passen!

Jetzt ist die Frage, wie ich die Keys austausche. Ich könnte entweder einen Satz an Keys hinterlegen und diese dann nacheinander verwenden oder ich müsste ihn quasi mit einer eigenen Clientnummer als Erkennung für die Hardwareclients mit dem alten Schlüssel verschlüsselt versenden. Den neuen Schlüssel würde ich über Random über einen analogen Port erstellen. Wenn ich den Schlüssel jede Minute ändere un der erste Schlüssel nicht bekannt ist, dürfe es nur mit großem Aufwand möglich sein meinen Key in dieser Zeit zu knacken.

Wenn ein Data-Array 16 Byte groß sein muss, kann ich damit nicht meine 6 int verschlüsseln! Das packt dann der NRF24 mit seinen 32 Bytes Payload nicht. Also müsste dies unverschlüsselt versendet werden, was ohnehin nicht dramatisch wäre, wenn der Code bekannt ist, denn wenn ich ein (1) oder aus (0) verschlüssel gibt es nur 2 Variablen, egal wie groß sie sind.

Bei einem Wechsel des Schlüssels jede Minute, könnte ich aber bei der Häufigkeit der Abfragen und Antworten, wenn der Code bekannt ist, ganz leicht einen Sketch schreiben, der mir einen Befehl sendet und einfach den verschlüsselten Wert als Authentifizierung kopiert und dranhängt. Folglich müsste der Code nach jeder Abfrage geändert werden, was bedeutet, dass ich zur schnelleren Verarbeitung keinen Chache verwenden kann und jedes mal neu ver- und entschlüsseln muss. Hier müsste ich mal die Zeit checken ...

Viele Grüße
itsy
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.03.2014, 22:57
Beitrag #8
RE: Sichere Übertragung mit NRF24
So, der Test ist abgeschlossen. Ver- und wieder entschlüsseln dauert insg. 1ms, ist also zu vernachlässigen. Allerdings ist die verschlüsselte Datei immer 16 Zeichen lang und besteht auch aus Sonderzeichen in einem char-Array.

Mein aktueller Code nutzt jedoch zum Senden und Empfangen entweder ein int- oder ein float-Array (je nach zu übertragenen Werte).

Diese Zeichenkette kann ich jetzt natürlich nicht mit einem int oder float übertragen. Also muss ich entweder meinen kompletten Code umschreiben (was aber zu viel Arbeit wäre) oder eine andere Lösung suchen ...
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  nrf24 an Mega 2560 jgrothe 2 167 10.09.2016 13:39
Letzter Beitrag: jgrothe
  Temperatur mit nrf24 übertragen jgrothe 17 687 09.09.2016 14:01
Letzter Beitrag: jgrothe
  Interrupt bei Serieller Übertragung Binatone 8 368 21.06.2016 14:09
Letzter Beitrag: Scheams
  NRF24 soll Daten empfangen und senden... MaHaI976 2 943 08.06.2015 19:36
Letzter Beitrag: MaHaI976
  float per NRF24 übertragen F2Ingo 9 1.654 14.04.2015 21:21
Letzter Beitrag: F2Ingo
  Accelerometerwert Übertragung via Bluetooth??? Brauche HIlfe Techniker2012 2 4.775 03.07.2014 18:21
Letzter Beitrag: rkuehle

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste