Verificar que un mensaje no fue alterado

Añade una etiqueta calculada con una clave secreta para detectar cuando un mensaje cambió en el camino.

Qué vas a construir

Un mensaje con una etiqueta: un número calculado a partir del mensaje y de una clave secreta. El receptor vuelve a calcularla. Si el mensaje cambió, la etiqueta no coincide.

Lo que aprendes

  • Qué es la integridad de un mensaje y cómo se comprueba.
  • Cómo mezclar una clave secreta con el mensaje antes de calcular el hash.
  • Por qué el checksum de la serie de redes no basta para la seguridad.

Idea clave

En la serie de redes, el checksum detecta errores accidentales. Un atacante puede recalcular un checksum sin dificultad. Una etiqueta con clave solo se puede generar con la clave secreta. Quien no la tiene no puede crear una etiqueta válida para un mensaje alterado.

Importante: esta etiqueta es didáctica. En la práctica se usa HMAC-SHA256, que es una construcción probada. No uses la función de este ejemplo para proteger datos reales.

Materiales en Tinkercad

  • Arduino Uno R3
  • Monitor serie

Paso 1: Código

const String CLAVE = "secreto";

unsigned long etiqueta(String texto) {
  String base = CLAVE + texto;
  unsigned long h = 5381;
  for (unsigned int i = 0; i < base.length(); i++) {
    h = h * 33 + base.charAt(i);
  }
  return h;
}

void setup() {
  Serial.begin(9600);
}

void loop() {
  // El emisor calcula la etiqueta del mensaje original
  String mensaje = "temp=25";
  unsigned long tag = etiqueta(mensaje);

  // El receptor recibe el mensaje y la etiqueta
  String recibido1 = "temp=25";
  String recibido2 = "temp=99";   // mensaje alterado

  Serial.print("Mensaje 1: ");
  Serial.println(etiqueta(recibido1) == tag ? "OK" : "ALTERADO");

  Serial.print("Mensaje 2: ");
  Serial.println(etiqueta(recibido2) == tag ? "OK" : "ALTERADO");

  Serial.println();
  delay(3000);
}

Paso 2: Prueba

  1. Abre el monitor serie. El mensaje 1 debe dar OK y el mensaje 2 ALTERADO.
  2. Cambia CLAVE a otra. ¿Cambia el resultado? ¿Por qué?
  3. Cambia recibido2 a temp=2S. ¿El checksum de la serie de redes detectaría este cambio? Calcula la suma de los caracteres de ambos mensajes y compara.

Cómo sabes que lo lograste

  • El mensaje original da OK y el alterado da ALTERADO.
  • Puedes explicar qué pasa si cambias la clave en el receptor.
  • Puedes explicar la diferencia entre checksum y etiqueta con clave.

Qué salió mal

Los dos mensajes dan OK. Revisa que recibido2 sea distinto de "temp=25".

El mensaje original da ALTERADO. Revisa que la clave y la función etiqueta() sean idénticas en emisor y receptor.

Siguiente clase

En la siguiente clase vas a detectar la presencia de una persona con un sensor de movimiento, y a activar una alarma.