Seguridad criptográfica en IoT (y VI)

lunes, 20 de junio de 2016


La proliferación de dispositivos y plataformas de servicios IoT está siendo mucho más rápida que la adopción de medidas de seguridad en su ámbito. Ante la apremiante necesidad de mecanismos que garanticen la autenticación, integridad y confidencialidad, tanto de las comunicaciones como de los propios dispositivos, se tiende a trasladar las soluciones criptográficas contrastadas en la IT tradicional, como son los certificados digitales de clave pública sobre protocolos SSL/TLS. Seguimos avanzando en el estado del arte de las soluciones criptográficas para IoT.

PoC Web 

Aunque la descripción literal de los comandos de autenticación pueda parecer enrevesada, una vez implementados dentro de una librería de código, su utilización se vuelve muy sencilla, como se observa a continuación:



 A modo de simple prueba de concepto (PoC) hemos implementado el caso de uso práctico de un dispositivo IoT que debe autenticarse ante un servicio web de forma robusta, utilizando hardware criptográfico para ello.

Para que el ejemplo pueda hacerse extensivo al público general, se emplea Arduino como entorno de desarrollo, sobre una plataforma ESP8266 que facilita el acceso a la web mediante su interface Wifi.

Podría utilizarse cualquier módulo ESP8266, en este caso se ha empleado un NodeMCU v0.9, cargando un sketch generado a partir del core ESP8266 para Arduino.Como hardware criptográfico se ha elegido un Cryto-Authenticator Atmel SHA204A conectado externamente al módulo NodeMCU.


De las diferentes librerías para Arduino que hay para manejar el SHA204A, la que mejor se adaptaba de forma general, y más trabajada se encontraba, era el trabajo de Nusku de 2013. No obstante, no parecería funcionar de forma uniforme en diferentes dispositivos, y presentaba algunas carencias importantes. Hemos solucionado estos problemas publicando nuestro propio fork en Github.

La autenticación en el servicio web se realiza insertando en la petición HTTP (GET request) un token de autenticación. Esta es una practica muy común y extendida entre los más importantes sistemas de autenticación web. Para ello se añade la cabecera (header) "Authorization", con los parámetros adecuados.

Estos deben incluir el tipo de token "11PATHS-HMAC-256", junto a los valores correspondientes codificados en formato Base64. Para simplificar el proceso, la cabecera incluye además del “id” del dispositivo, el "nonce" (challenge) y la "base" utilizados para calcular la firma "signature" de verificación, aunque el protocolo soporta el que challenge lo proporcione el servidor.

Al enviar todos estos datos en la petición, seria posible volver a re-utilizar peticiones capturadas. Para evitar esta debilidad se agrega el timestamp como parte de la petición a firmar en formato unix-time.

GET /?timestamp=1458647701 HTTP/1.1\r\n

Para poder realizar la firma de la petición HTTP con el Atmel SHA204A, esta se resume a 20 bytes mediante el algoritmo SHA-1. El core de Arduino para ESP8266 incluye esta función en la librería "Hash.h", pero en caso de utilizar otra plataforma se puede añadir desde la Crytosuite para Arduino.

Con los 20 bytes obtenidos se invoca el comando Nonce del SHA204A, obteniendo los 32 bytes resultantes a modo de reto, que son almacenados.

Seguidamente se invoca el comando HMAC indicando el número de slot que contiene clave con la que se calculará la HMAC-SHA-256, junto al modo de ejecución. Conocidos estos valores (modo y slot) se puede deducir la base de 24 bytes añadida al calculo. El resultado de este comando serán los 32 bytes correspondientes a la firma de la petición.

Estos valores, junto con el "id" que asignemos al dispositivo, serán los parámetros en base64 que incluirá la cabecera. La codificación en base64 se realiza utilizando la librería de Adam Rudd.

Authorization: 11PATHS-HMAC-256
id="EjEjEg==",
nonce="LmzzEpRnXvqmvnbOSobGp1VysR/wEpWoMNaY2Miew5g=", base="EQACAAAAAAAAAAAAAAAA7gAAAAABIwAA", signature="4qnOa5ZGecdzC+DscOSuOhJ64LeB1jTieJATUWPoIZE="



El servicio web podrá verificar la autenticidad del dispositivo IoT que realiza la petición, realizando los mismos cálculos y comparando los resultados. Para ello, tan solo debe conocer la clave de 32 bytes asignada al dispositivo por su "id".

Como parte de la demostración, se ha publicado el servicio web de ejemplo en la url: http://sha204a.cf 

Este servicio web responderá con un JSON que contendrá información relativa a la autenticación, en caso de ser válida, o en su defecto, con los detalles del error que se haya producido. Puede ser utilizado libremente para la realización de pruebas, ya que responde a cualquier id, que haya firmado con la clave de ejemplo:

"EB0C68BF96E8C26635D3450293D2FC501A63A09924FE90A7BD916AC521FDE0AA"

En este ejemplo no se produce una autenticación recíproca, es decir; la repuesta del servicio web no contiene ningún parámetro destinado a verificar su propia legitimidad, aunque hubiera sido fácil haberlo incorporado. Usualmente se delega esta condición al establecer una conexión segura SSL (https) donde se verifica el certificado del servidor web.

El código del sketch Arduino es muy simple. Gestiona la conexión a Internet, mediante la librería "WiFiManager.h", la cual si no se ha configurado o no está disponible el SSID o su credencial no es válida, levanta un AP con un portal cautivo desde el que configurar la red Wifi. Una vez establecida la conexión a Internet, se establece la hora actual s través de un servidor NTP.

Cada vez que se pulse el botón FLASH, realizará una petición autenticada por el SHA204A al servicio web configurado.


Para probar la conexión al servicio web se puede utilizar un simple Script en BASH que simula el cálculo de la firma tal y como lo haría el ATSHA204A y realiza al petición web.

Tanto este Shell Script, como el código Arduino para el módulo IoT, y el código en PHP del servicio web están publicados en este espacio de Github: https://github.com/latchdevel/crypto-iot

Con toda la información facilitada es posible deducir fácilmente el número de slot que ocupa la clave utilizada como ejemplo en el ATSHA204A. La primera persona que nos explique cómo en la Community de ElevenPaths, recibirá un módulo de evaluación Atmel CryptoAuthXplained. 


* Seguridad criptográfica en IoT (I)
* Seguridad criptográfica en IoT (II)
* Seguridad criptográfica en IoT (III)
* Seguridad criptográfica en IoT (IV)
* Seguridad criptográfica en IoT (V)
* Seguridad criptográfica en IoT (y VI)


Jorge Rivera
jorge.rivera@11paths.com

No hay comentarios:

Publicar un comentario