Invio sicuro dei dati da un microcontrollore a un server

3

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:

  1. Invia una sorta di pacchetto HELLO SERVER al server
  2. Il server genera un vettore di inizializzazione casuale usando / dev / random, aggiunge un hash HMAC-SHA256 ad esso e lo rimanda all'arduino.
  3. L'arduino verifica l'IV ricevuta con l'hash HMAC-SHA256.
  4. 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.
  5. Arduino invia il risultato al server
  6. 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.

    
posta Jaaisto 09.09.2017 - 16:37
fonte

1 risposta

2

La tua idea di scaricare la generazione IV sul server sembra logica e soddisfacente. Ci sono solo alcune cose che vorrei aggiungere per renderlo più sicuro.

  • La regola generale è usa chiavi diverse per hashing e crittografia .

  • Che cosa farai se le chiavi utilizzate per HMAC / AES sono compromesse? Sfortunatamente, non ho ancora nessuna soluzione facile da mantenere / implementare a questo problema.

  • Nello schema corrente, qualcuno può riprodurre il pacchetto HELLO SERVER e continuare a generare IV casuali dal tuo server. Puoi proteggerti crittografando il tuo messaggio HELLO SERVER con una chiave AES fissa e inviando un timestamp nel tuo pacchetto.

  • È possibile mantenere un timestamp / nonce in tutti i messaggi per garantire che nessuno riproduca i valori di temperatura / IV. Ciò richiederà che il client e il server abbiano un'implementazione della finestra scorrevole per il rilevamento della riproduzione.

  • Una possibile ottimizzazione può essere che il server generi una chiave AES e una IV sul tempo di registrazione del client. Ciò garantirà che anche se la chiave è trapelata, i dispositivi Arduino che sono già registrati non sono interessati.

Per tutti i punti precedenti, considera i compromessi relativi alla sicurezza / al tempo degli sviluppatori e poi prendi una decisione.

    
risposta data 10.09.2017 - 02:35
fonte

Leggi altre domande sui tag