Υπάρχουν πολλοί τρόποι για να ασφαλίσουμε μια επικοινωνία μέσω διαδικτύου, αλλά δεν θα λειτουργήσουν όλοι σε ένα μικροελεγκτή όπου η επεξεργαστική ισχύς και η μνήμη είναι περιορισμένη.

Το project περιλαμβάνει την δημιουργία ενός ασφαλούς και ελαφρού client/server πρωτοκόλλου το οποίο είναι ιδανικό για την εκτέλεση σε μικροελεγκτές.

Server → Συσκευή IoT η οποία λαμβάνει εντολές.

Client → Αποστολέας εντολών.

1.1. Περιγραφή του Project

1.1.1 Προαπαιτούμενα για επικοινωνία Client - Server

  • Αρχηκοποίηση παραμέτρων επικοινωνίας.

    • Συμφωνία client - server για την αρχηκοποίηση των δεδομένων αφύπνησης (0-m).

    • Συμφωνία client - server για την αρχηκοποίηση των δεδομένων δοκιμασίας (1-n).

    • Χρήση της ίδιας function για την παραγωγή των hash.

    • Χρήση ίδιου μυστικού κωδικού για την επικοινωνία.

    • Χρήση κοινών ονομάτων εντολών.

  • Δημιουργία τυχαίου αριθμού (seed) για τη γεννήτρια τυχαίων αριθμών (Server).

  • Η IP και το Port number του Server πρέπει να είναι γνωστά στον Client.

1.1.2 Μεθοδολογία

Σε ορισμένες βιβλιοθήκες, όπως αυτή που χρησιμοποιήθηκε στο project (Arduino Ethernet2 lib), χρειάζεται ο client να στείλει πρώτος δεδομένα αφού δημιουργηθεί η σύνδεση, διαφορετικά ο server δεν αντιλαμβάνεται το κανάλι επικοινωνίας που έχει δημιουργηθεί.

  1. Client: Δημιουργεί ένα tcp socket μέσω του οποίου συνδέεται στον server. Στη συνέχεια στέλνει ένα συγκεκριμένο αριθμό από bytes προκειμένου να τον αφυπνήσει.

  2. Server: Στέλνει στον Client (n) τυχαία bytes τα οποία θα χρησιμοποιηθούν για την δοκιμσία που πρέπει να λύσει επιτυχώς ο Client.

  3. Client: Υπολογίζει και στέλνει το HMAC των δεδομένων που δέχτηκε (n bytes) + την εντολή που θέλει να στείλει στον server για εκτέλεση χρησιμοποιώντας τον μυστικό κωδικό, που μόνο ο server και o client γνωρίζουν.

  4. Server: Ξεκινάει να υπολογίζει HMACs (με το μυστικό κωδικό) χρησιμοποιώντας τα n bytes που δημιούργησε + πιθανές εντολές, αλλάζοντας κάθε φορά μόνο την πιθανή προς εκτέλεση εντολή. Κάθε hash που δημιουργεί, το συγκρίνει με το hash που δέχθηκε από τον client και όταν παράξει το hash το οποίο έχει προκύψει από την εντολή που του έστειλε ο client, τότε θα ξέρει πως να ενεργήσει.

[ Προαιρετικά: Κάθε εντολή που εκτελείται επιστρέφει έναν κωδικό. Ο server μπορεί να υπολογίσει το HMAC χρησιμοποιώντας τα n τυχαία bytes + τον κωδικό επιστροφής και να το στείλει στον client έτσι ώστε αυτός να μπορέσει το αποτέλεσμα εκτέλεσης. ]

  1. [ Προαιρετικά: Για να βρει ο client ποια εντολή εκτελέστηκε, ακολουθεί την ίδια διαδικασία που πραγματοποιήθηκε στον server (όλοι οι κωδικοί απάντησης είναι γνωστοί). ]

1.1.3 Δεδομένα επικοινωνίας

Arduino με ethernet shield
  1. Client: Στέλνει 0 έως m bytes.

  2. Server: Στέλνει 1 έως n τυχαία bytes.

  3. Client: Στέλνει HMAC των 256 bits. HMAC(bytes πρόκλησης + προς εκτέλεση εντολή, μυστικός κωδικός).

  4. [ Προαιρετικά: Ο server στέλνει HMAC των 256 bits. hmac( πρόκλησης + αποτέλεσμα εντολής, μυστικός κωδικός ) ]

1.1.4 Δοκιμές

Χρονικές αποκρίσεις
  • Arduino pro mini (16Mhz)

1η εντολή

time1

3η εντολή

time2
  • Arduino pro mini (8Mhz)

1η εντολή

time1

2η εντολή

time2

3η εντολή

time2
Παρατηρήσεις:
Arduino 16Mhz -> 57ms/command
Arduino  8Mhz -> 114ms/command
  • Διπλάσια συχνότητα = μισός χρόνος παραγωγής HMAC.

  • Η κάθε επιπλέον εντολή στη συλλογή των εντολών χρειάζεται σταθερό επιπλέον χρόνο μέχρι να αναγνωριστεί και να εκτελεστεί.

1.1.5 Προβλήματα που παρουσιάστηκαν κατά την υλοποίηση

  1. Δεν υπήρχαν timeouts στην πρώτη υλοποίηση οπότε όταν στράφηκε προς τον έξω κόσμο για πρώτη φορά, σε τυχαία χρονικά διαστήματα, σταματούσε η αποδοχή νέων συνδέσεων.

  2. Στην περίπτωση που η συσκευή εγκατασταθεί σε δίκτυο το οποίο δεν έχει σταθερή IP, θα πρέπει να υπάρχει διαδικασία ανανέωσης του DNS.

  3. Η μνήμη του arduino έχει γεμίσει κατά 50-60% μόνο με τα βασικά libraries δικτύωσης, κρυπτογραφίας και του IoT πρωτοκόλλου.

1.1.6 Βελτιώσεις / αναβαθμίσεις

  1. Το arduino να ενημερώνει μόνο του το DNS σε περίπτωση δυναμικής IP.

  2. Ικανότητα δημιουργίας OTP (One Time Passwords / κωδικοί μιας χρήσης) για την δυνατότητα εκτέλεσης εντολών χωρίς τη χρήση των κρυπτογραφικών συναρτήσεων του πρωτοκόλλου (απλά GET requests).

  3. Αναβάθμιση του πρωτοκόλλου για δυνατότητα μεταφοράς μεγαλύτερου όγκου πληροφορίας (AES).

1.1.7 Συμπεράσματα

Υπέρ
- Όχι πολύπλοκο
- Ελάχιστες απαιτήσεις μνήμης*
- Ελάχιστη χρήση cpu*
- Γρήγορο**
- Αυθεντικοποίηση
- Εμπιστευτικότητα
- Replay protection

*με τη χρήση των σωστών hash functions

**όταν χρησιμοποιείται ένα μικρό ποσοστό εντολών
Κατά
- Χρησιμοποιεί συμμετρική κρυπτογράφηση
- Δεν είναι σχεδιασμένο για να στέλνει πολλά bytes (1 byte commands recommended)
- Απαιτεί έναν τυχαίο αριθμό (seed)
- Όταν χρησιμοποιείται σε μικροελεγκτές είναι ευάλωτο σε DOS επιθέσεις (χρειάζεται firewall)
Note
Υλοποιημένο σε Node.JS ως client, αλλά και σε android, με arduino pro mini με ethernet shield ως server.

1.2. Υλικό που χρησιμοποιήθηκε κατά την υλοποίησή του

Arduino mini pro
Figure 1. Arduino mini pro.
Ethernet shield
Figure 2. Ethernet shield for arduino.
Καλώδιο ethernet
Figure 3. Καλώδιο ethernet.
Door mechanism
Figure 4. Door mechanism.
Door mechanism
Figure 5. Door mechanism.
Arduino με ethernet shield
Figure 6. Arduino με ethernet shield.
Final overview
Figure 7. Final overview.

1.3. Συνδεσμολογία & Σχηματικά

Arduino & ethernet shield
Figure 8. Arduino & ethernet shield.
Arduino - door schematic
Figure 9. Arduino - door.
Συνδεσμολογία διπλής μπουτονιέρας
Figure 10. Συνδεσμολογία διπλής μπουτονιέρας.

1.4 Εφαρμογή Android

GUI
Figure 11. GUI.
Settings
Figure 12. Settings
Setup εφαρμογής για επικοινωνία με τον server
[
    {
        "group": "Gate",
        "actions": [
            {
                "action": "State",
                "cmd": 0,
                "url": "akamai.webhop.me:777",
                "hmacKey": "supersecret",
                "hashByteLength": 32,
                "randDataLength": 100,
                "responses": [
                    {
                        "value": "0x00",
                        "description": "Closed",
                        "color": "#FF0000"
                    }, {
                        "value": "0x01",
                        "description": "Open",
                        "color": "#00C110"
                    }, {
                        "value": "0x02",
                        "description": "Middle",
                        "color": "#E5BF00"
                    }
                ],
                "repeat": null,
                "type": "state"
            }, {
                "action": "Switch",
                "cmd": 1,
                "url": "akamai.webhop.me:777",
                "hmacKey": "supersecret",
                "hashByteLength": 32,
                "randDataLength": 100,
                "responses": [
                    {
                        "value": "0x00",
                        "description": "OK",
                        "color": "#000000"
                    }
                ],
                "repeat": null,
                "type": "feedback"
            }
        ]
    },
    {
        "group": "Gate Wifi",
        "actions": [
            {
                "action": "State",
                "cmd": 0,
                "url": "192.168.0.6:777",
                "hmacKey": "supersecret",
                "hashByteLength": 32,
                "randDataLength": 100,
                "responses": [
                    {
                        "value": "0x00",
                        "description": "Closed",
                        "color": "#FF0000"
                    }, {
                        "value": "0x01",
                        "description": "Open",
                        "color": "#00C110"
                    }, {
                        "value": "0x02",
                        "description": "Middle",
                        "color": "#E5BF00"
                    }
                ],
                "repeat": null,
                "type": "state"
            }, {
                "action": "Switch",
                "cmd": 1,
                "url": "192.168.0.6:777",
                "hmacKey": "supersecret",
                "hashByteLength": 32,
                "randDataLength": 100,
                "responses": [
                    {
                        "value": "0x00",
                        "description": "OK",
                        "color": "#000000"
                    }
                ],
                "repeat": null,
                "type": "feedback"
            }
        ]
    }
]

1.5 Βιβλιογραφία