Desidero trasferire i dati in modo sicuro da un arduino (un microcontrollore) a un server.
La soluzione più ovvia è probabilmente l'uso di TLS, ma arduino non ha la capacità di eseguirlo.
Non ho trovato alcuna altra implementazione leggera che potesse essere eseguita su un arduino con le funzionalità necessarie (crittografia e autenticazione).
Tuttavia, ho trovato implementazioni di AES128-CBC e HMAC-SHA256 che possono essere eseguite su un arduino. Mi piacerebbe utilizzare questi algoritmi.
Il problema è che AES richiede un vettore di inizializzazione. Questo è difficile da ottenere usando un microcontrollore e non desidero stringere qualche generatore di numeri casuali dell'hardware.
Entra nella zona di pericolo:
Chiedi al server di generarne uno per me.
Supponendo che ci siano due chiavi che l'arduino e il server hanno in memoria:
- Invia una sorta di pacchetto HELLO SERVER al server
- Il server genera un vettore di inizializzazione casuale usando / dev / random, aggiunge un hash HMAC-SHA256 ad esso e lo rimanda all'arduino.
- L'arduino verifica l'IV ricevuta con l'hash HMAC-SHA256.
- L'arduino crittografa il testo in chiaro usando AES128-CBC (con il IV ricevuto) e poi lo esegue tramite HMAC-SHA256, aggiungendo l'hash risultante al testo cifrato.
- Arduino invia il risultato al server
- Il server verifica l'HMAC e quindi decodifica il testo cifrato usando la IV che ricorda.
Questo suona valido a tutti?
Dovrei usare due chiavi pre-condivise uniche? Uno per AES e l'altro per HMAC? L'utilizzo di una sola chiave rende la sicurezza di AES dipendente da SHA256?
Ci sono altri modi per ottenere ciò che voglio senza hardware aggiuntivo?
Dichiarazione di non responsabilità: questo è solo per scopi di apprendimento divertenti: i miei dati di temperatura non sono così sensibili.