Ho un progetto scolastico che coinvolge un sensore basato su Arduino che deve inviare letture di sensori a un server tramite HTTP. Le letture del sensore non devono essere crittografate (va bene che la gente sappia cosa sono) ma vogliamo (1) autenticare l'Arduino e (2) assicurarsi che i dati non siano cambiato in transito .
Dopotutto, non vogliamo che nessuno sia in grado di inviare letture dei sensori al server e vogliamo sapere da dove provengono effettivamente queste letture.
Ho pensato di usare i Token Web JSON (che sono piuttosto compatti e possono essere codificati nell'arduino o su una scheda SD) per autenticare l'Arduino, ma gli attacchi Man-in-the-Middle sarebbero ancora un problema se stiamo usando solo HTTP su TCP. La raccomandazione sembra essere quella di usare HTTPS, ma ho letto da qualche parte che un Arduino non ha la potenza richiesta per HTTP su TLS. (È proprio vero? Devo ancora provarci)
Ho pensato al seguente approccio e apprezzerei qualsiasi idea sul fatto che avrebbe effettivamente risolto il problema.
-
L'Arduino ha un token Web JSON (che identifica l'Arduino e contiene un valore segreto
k
). -
Arduino calcola un HMAC per i dati utilizzando la chiave
k
. Chiama questo H.H = hmac(data, k)
-
Arduino invia il JWT, i dati e H utilizzando una connessione non sicura (HTTP su TCP).
-
Il server riceve il messaggio da Arduino. Decifra il JWT, che solo può fare perché il JWT è stato simmetricamente crittografato sul server. Dopo aver decrittografato il JWT, il server ora conosce
k
& dati e può calcolare H, permettendogli di verificare l'integrità dei dati, nonché di autenticare Arduino.
Mi sbaglio? C'è una soluzione migliore? Grazie in anticipo.