Integrità e autenticazione dei dati di un Arduino utilizzando token Web e HMACs JSON

1

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.

  1. L'Arduino ha un token Web JSON (che identifica l'Arduino e contiene un valore segreto k ).

  2. Arduino calcola un HMAC per i dati utilizzando la chiave k . Chiama questo H.

    H = hmac(data, k)

  3. Arduino invia il JWT, i dati e H utilizzando una connessione non sicura (HTTP su TCP).

  4. 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.

    
posta Vincent 06.05.2016 - 02:45
fonte

3 risposte

1

Poiché questo è un dispositivo incorporato e le risorse sono limitate, puoi ridurlo un po '.

Stai già calcolando la firma dei dati, quindi perché non inserire semplicemente i dati nel JWT e calcolare la firma JWT?

Questo risolve un paio di problemi. Innanzitutto, il JWT cambia costantemente, quindi la capacità di riprodurlo può essere notevolmente ridotta. In secondo luogo, stai inviando meno dati.

È necessario fare un po 'di lavoro sul lato server per impedire i replay. Puoi timestampare il JWT se disponi di un orologio a tua disposizione e accetta solo valori in cui il timestamp è maggiore dell'ultimo timestamp visualizzato o utilizza semplicemente un contatore incrementale nel JWT (richiesta 1, richiesta 2, richiesta 3, ecc.) .

Parlare pedissamente ... a questo punto è meno di una JWT e più di un payload generico JWS. Un JWT ha requisiti specifici per i reclami all'interno del corpo quali emittente, scadenza / validità, soggetto, ecc., Mentre un JWS è più o meno solo un pezzo di JSON firmato.

    
risposta data 10.03.2017 - 15:15
fonte
0

Ho lo stesso problema qui. Ho trovato una soluzione più o meno uguale alla mia.

La mia soluzione è quando il mio dispositivo si connette a un hardware, genera una chiave, restituisce la chiave al proprietario del dispositivo e quando il dispositivo deve fare qualcosa usa questa chiave per trasferire un dato json criptato con AES 256.

    
risposta data 09.01.2017 - 07:30
fonte
0

Il tuo protocollo proposto ha almeno un punto debole, non fornisce alcuna protezione per la riproduzione (diversamente da, ad esempio, TLS). Poiché il tuo obiettivo è inviare i dati del sensore, questo potrebbe essere un problema in quanto un utente malintenzionato può continuare a inviare vecchi dati del sensore.

    
risposta data 09.01.2017 - 11:10
fonte

Leggi altre domande sui tag