Arduino ad Android connessione bluetooth sicura

3

Sto utilizzando Arduino Uno e un Scheda nRF8001 di Adafruit per connettersi a un telefono Android tramite Bluetooth. Lo userò per bloccare e sbloccare un lucchetto e devo assicurarmi che solo i dispositivi verificati siano in grado di avviare il blocco e lo sblocco. Ho cercato intorno a un gruppo e ho difficoltà a trovare un chiaro esempio di cosa dovrei fare per verificare il dispositivo di connessione. Attualmente ho il Arduino collegato al blocco e ogni volta che il telefono Android si connette, è consentito bloccare e sbloccare.

Sono abbastanza nuovo per la crittografia e alcune indicazioni sarebbero utili. Da quello che ho letto, sembra che l'hashing MD5 sia rotto e non la soluzione corretta per il mio problema. Ho trovato SipHash e sembra essere la cosa più vicina di cui potrei avere bisogno. Il processo che avevo in mente è il seguente.

  1. Android tenta di connettersi ad Arduino
  2. Arduino vede la richiesta e invia una stringa casuale al dispositivo Android
  3. L'Android crittografa la stringa con una chiave segreta condivisa e la rimanda a Arduino
  4. L'Arduino decifra la stringa crittografata e verifica che corrisponda all'originale che ha inviato se lo fa va avanti e si connette / continua con il blocco o lo sblocco.

Sono sulla buona strada con SipHash e il processo sopra? C'è un modo migliore per farlo? Dopo aver cercato qui ho trovato alcune informazioni qui. Sembra che dovrei preoccuparmi degli attacchi man-in-the-middle e dello spoofing MAC. Vorrei solo controllare l'indirizzo MAC come verifica, ma da quello che ricordo, è molto facile falsificare gli indirizzi MAC. Qualsiasi aiuto sarebbe apprezzato.

    
posta BlueBeardo 27.12.2014 - 03:27
fonte

1 risposta

2

Hai l'idea giusta, ovvero un segreto condiviso che non viene mai trasmesso da un dispositivo all'altro. Se lo fai, non dovresti preoccuparti degli indirizzi MAC o degli attacchi MITM. Sei vulnerabile solo se l'attaccante può ottenere quel segreto condiviso.

Poiché il segreto condiviso è la chiave {ahem} , devi essere certo che non può essere generato in modo indipendente. Un modo per farlo è generarlo con un generatore di numeri pseudo casuali crittograficamente sicuro ( CSPRNG ). Potresti anche considerare l'utilizzo di parole Diceware , che sono un po 'più amichevoli, ma necessiteranno di una stringa più lunga per ottieni uguale entropia.

Ora, riguardo all'algoritmo attuale: SipHash è nuovo per me, ma una piccola lettura mi dice che è una funzione di hash con chiave. Cioè, non è invertibile, quindi il passaggio 4. non funzionerà come tu lo hai scritto.

Se SipHash è un dato, allora il Passo 3 è "L'hash di Android la stringa con una chiave segreta condivisa e la rimanda all'Arduino".

Il passo 4 è la vera differenza: "Arduino calcola lo stesso hash e verifica che corrisponda all'hash ricevuto da Android, se lo fa va avanti e si connette / continua con il blocco o lo sblocco."

In alternativa, è possibile utilizzare la crittografia simmetrica, come AES. Un po 'di Google in giro trova le librerie AES per Arduino e so che esistono per Android.

    
risposta data 27.12.2014 - 05:12
fonte

Leggi altre domande sui tag