Enviando datos de forma segura desde un microcontrolador a un servidor

3

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:

  1. Envíe algún tipo de paquete HELLO SERVER al servidor
  2. 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.
  3. El arduino verifica el IV recibido con el hash HMAC-SHA256.
  4. 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.
  5. Arduino envía el resultado al servidor
  6. 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.

    
pregunta Jaaisto 09.09.2017 - 16:37
fuente

1 respuesta

2

Su idea de descargar la generación IV al servidor parece lógica y está bien. Hay algunas cosas que me gustaría agregar para hacerlo más seguro.

  • La regla general de oro es usa diferentes claves para el hashing y el cifrado .

  • ¿Qué hará si se comprometen las claves utilizadas para HMAC / AES? Desafortunadamente, todavía no tengo ninguna solución fácil de mantener / implementar para ese problema.

  • En el esquema actual, alguien puede reproducir el paquete HELLO SERVER y seguir generando IVs aleatorios desde su servidor. Puede protegerse contra él cifrando su mensaje HELLO SERVER mediante una clave AES fija y enviando una marca de tiempo en su paquete.

  • Puedes mantener una marca de tiempo / nonce en todos los mensajes para asegurarte de que nadie vuelva a reproducir tus valores de temperatura / IV. Esto requerirá que su cliente y servidor tengan una implementación de ventana deslizante para la detección de repetición.

  • Una posible optimización puede ser que el servidor genere una clave AES y una IV en el tiempo de registro del cliente. Esto asegurará que, incluso si su clave se filtra, los dispositivos Arduino que ya están registrados no se verán afectados.

Para todos los puntos anteriores, considere las ventajas y desventajas del tiempo de seguridad / desarrollador y luego tome una decisión.

    
respondido por el Limit 10.09.2017 - 02:35
fuente

Lea otras preguntas en las etiquetas