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.
-
El Arduino tiene un token web JSON (que identifica al Arduino y contiene un valor secreto
k
). -
El Arduino calcula un HMAC para los datos usando la clave
k
. Llama a esto H.H = hmac(data, k)
-
El Arduino envía el JWT, los datos y H mediante una conexión insegura (HTTP sobre TCP).
-
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.