Deseo transferir datos de forma segura desde un arduino (un microcontrolador) a un servidor.
La solución obvia es probablemente usar TLS, pero arduino no tiene la capacidad de ejecutarlo.
Tampoco encontré ninguna otra implementación ligera que pudiera ejecutarse en un arduino con las características necesarias (cifrado y autenticación).
Sin embargo, he encontrado implementaciones de AES128-CBC y HMAC-SHA256 que pueden ejecutarse en un arduino. Me gustaría usar estos algoritmos.
El problema es que AES requiere un vector de inicialización. Esto es difícil de lograr con un microcontrolador y no deseo conectar un generador de números aleatorios de hardware.
Introduce la zona de peligro:
Pida al servidor que genere uno para mí.
Suponiendo que hay dos claves que tanto el arduino como el servidor tienen en la memoria:
- Envíe algún tipo de paquete HELLO SERVER al servidor
- El servidor genera un vector de inicialización aleatorio utilizando / dev / random, le agrega un hash HMAC-SHA256 y lo envía de vuelta al arduino.
- El arduino verifica el IV recibido con el hash HMAC-SHA256.
- El arduino encripta el texto simple usando AES128-CBC (con el IV que recibió) y luego lo ejecuta a través de HMAC-SHA256, anexando el hash resultante al texto cifrado.
- Arduino envía el resultado al servidor
- El servidor verifica el HMAC y luego descifra el texto cifrado utilizando el IV que recuerda.
¿Esto suena viable en absoluto?
¿Necesitaría usar dos claves únicas previamente compartidas? ¿Uno para AES y el otro para HMAC? ¿El uso de una sola clave hace que la seguridad de AES dependa de SHA256?
¿Hay otras formas de lograr lo que quiero sin hardware adicional?
Descargo de responsabilidad: esto es solo para fines de aprendizaje divertido: mis datos de temperatura no son tan sensibles.