Integridad de los datos y autenticación de un Arduino utilizando JSON Web Tokens y HMACs

1

Tengo un proyecto escolar que involucra un sensor basado en Arduino que necesita enviar lecturas de sensores a un servidor a través de HTTP. Las lecturas del sensor no necesitan estar cifradas (está bien que la gente sepa lo que son) pero queremos (1) autenticar el Arduino y (2) asegurarnos de que los datos no estén cambiado en tránsito .

Después de todo, no queremos que nadie pueda enviar las lecturas de los sensores al servidor, y queremos saber de dónde provienen esas lecturas.

Pensé en usar JSON Web Tokens (que son bastante compactos y pueden ser codificados en el Arduino o en una tarjeta SD) para autenticar el Arduino, pero los ataques Man-in-the-Middle aún serían una problema si solo estamos usando HTTP sobre TCP. La recomendación parece ser usar HTTPS, pero he leído en alguna parte que un Arduino no tiene la potencia necesaria para HTTP a través de TLS. (¿Es esto realmente cierto? Todavía tengo que intentarlo)

He pensado en el siguiente enfoque y agradecería cualquier pensamiento sobre si realmente abordaría el problema.

  1. El Arduino tiene un token web JSON (que identifica al Arduino y contiene un valor secreto k ).

  2. El Arduino calcula un HMAC para los datos usando la clave k . Llama a esto H.

    H = hmac(data, k)

  3. El Arduino envía el JWT, los datos y H mediante una conexión insegura (HTTP sobre TCP).

  4. El servidor recibe el mensaje del Arduino. Descifra el JWT, que solo puede hacer porque el JWT se cifró simétricamente en el servidor. Después de descifrar el JWT, el servidor ahora conoce k & datos y puede calcular H, lo que le permite verificar la integridad de los datos, así como autenticar el Arduino.

¿Estoy equivocado? ¿Hay una solución mejor? Gracias de antemano.

    
pregunta Vincent 06.05.2016 - 02:45
fuente

3 respuestas

1

Ya que este es un dispositivo integrado y los recursos son limitados, puede reducir esto un poco.

Ya estás calculando la firma de los datos, así que, ¿por qué no pegar los datos en el JWT en su lugar y calcular la firma del JWT?

Esto resuelve un par de problemas. Primero, el JWT está cambiando constantemente, por lo que la capacidad de reproducción puede reducirse significativamente. En segundo lugar, estás enviando menos datos.

Necesitas hacer un poco de trabajo en el lado del servidor para evitar repeticiones. Puede marcar la hora del JWT si tiene un reloj disponible y solo aceptar valores donde la marca de tiempo es mayor que la última marca de tiempo vista, o simplemente usar un contador de incremento en el JWT (solicitud 1, solicitud 2, solicitud 3, etc.) .

Hablando de manera pedante ... en este punto, es menos de un JWT y más de una carga genérica de JWS. Un JWT tiene requisitos específicos para reclamaciones dentro del cuerpo, como emisor, caducidad / validez, asunto, etc., mientras que un JWS es más o menos una parte del JSON firmado.

    
respondido por el Steve 10.03.2017 - 15:15
fuente
0

Tengo el mismo problema aquí. Encontré una solución +/- la misma que yo.

Mi solución es cuando mi dispositivo se conecta a un hardware, genera una clave, la envía de vuelta al propietario del dispositivo y, cuando el dispositivo necesita hacer algo, utiliza esta clave para transferir datos Json cifrados con AES 256.

    
respondido por el Paulo Coutinho 09.01.2017 - 07:30
fuente
0

Su protocolo propuesto tiene al menos una debilidad, no proporciona protección de repetición (a diferencia de, por ejemplo, TLS). Dado que su objetivo es enviar datos del sensor, esto podría ser un problema, ya que un atacante puede seguir enviando datos antiguos del sensor.

    
respondido por el Lekensteyn 09.01.2017 - 11:10
fuente

Lea otras preguntas en las etiquetas