¿Es inseguro pedir el nonce actual del servidor?

2

Estoy desarrollando una aplicación integrada que entrega información a través de HTTP a mi servidor web. Estas entregas están aseguradas por un hash

H(secret : data : nonce)

donde el secreto se comparte entre las dos entidades y los datos son los datos que se entregan. El nonce es para proteger contra ataques de reproducción.

Mi problema es que el dispositivo integrado no tiene idea de la hora actual y no puedo almacenar ningún dato. Por lo tanto, en cada reinicio del dispositivo, el nonce comienza en 1, lo que no es muy bueno.

Estoy pensando en usar un contador como el nonce y luego preguntar al servidor web en cada inicio qué fue lo último que usó el nonce y usarlo como punto de partida. En mi cabeza, esto suena seguro ya que el nonce no es un secreto, es decir, no tiene sentido no decirle al mundo sobre ello. Pero, ¿hay alguna implicación de seguridad que haya pasado por alto?

    
pregunta m__ 09.09.2013 - 21:59
fuente

1 respuesta

4

Lo primero es lo primero. Tu "hash" es en realidad un MAC y un pobre uno porque no garantiza la seguridad con las funciones hash habituales (SHA-1, SHA-256 ...). Busque el ataque de extensión de longitud para obtener más información. Básicamente, si desea un MAC, use un MAC adecuado, por ejemplo. HMAC . Cada llamada HMAC requiere un par de invocaciones de la función hash subyacente, una de ellas con entrada corta, por lo que esto debería ser aceptable para su dispositivo.

Suponiendo un MAC adecuado, debes considerar para qué sirve el nonce. El nonce protege contra ataques de repetición solo mientras:

  • El servidor comprueba que el valor de nonce es lo que espera (de manera equivalente, el servidor vuelve a calcular el MAC utilizando su valor de nonce conocido, y el MAC solo coincidirá si ese nonce es el mismo que el utilizado en el dispositivo) .
  • Los valores de nonce son no predecibles .

Las dinámicas normales son las siguientes:

  • El cliente se conecta al servidor con algún tipo de conexión.
  • El servidor devuelve un valor nonce recién generado.
  • El cliente calcula el MAC y envía los datos y el valor de MAC asociado al servidor.
  • El servidor comprueba el valor de MAC.

En el contexto HTTP, esto significa un par de solicitudes. Nominalmente, las solicitudes HTTP son independientes entre sí y, por lo tanto, pueden aparecer en la misma conexión (con "keep-alive"), o usar conexiones distintas; en el lado del servidor, si se usa el equilibrio de carga, las solicitudes pueden ir a distintos front-end. Esto puede hacer las cosas más difíciles para usted. El punto crítico es que el servidor debe aceptar un valor de nonce dado solo una vez . Si se ha recibido una respuesta, utilizando un valor MAC computado con un nonce específico, entonces el nonce se "quema" y NO DEBE volver a aceptarse.

Ahora para la no-previsibilidad: suponga que el valor de nonce es, digamos, un contador mantenido en el servidor (usar la hora actual sería equivalente). En algún momento, el valor del contador es C , por lo que el atacante puede predecir que algún tiempo después será C + 100 (o C + 100000 o lo que sea). Dicho atacante podría interceptar una conexión entre el dispositivo y el servidor, y enviar el valor de nonce C + 100 al dispositivo. El dispositivo, que cree que habla con el servidor original, enviará un paquete de datos que contiene un valor MAC correcto para nonce C + 100 . El atacante registra que responde. Más tarde, cuando el contador del servidor llega a C + 100 , el atacante se hace pasar por el dispositivo y envía la respuesta grabada.

Por lo tanto, un nonce predecible permite al atacante recopilar un paquete de datos (válido) del dispositivo y enviarlo al servidor en el momento de su elección. El atacante no podrá falsificar un paquete de datos puramente sintéticos, pero puede decidir cuándo llegará el paquete al servidor. Dependiendo de su contexto exacto, esto puede o no ser un problema; Sin embargo, es más seguro prevenir que ocurran tales cosas.

Esto resume lo siguiente:

  • No es un problema que las personas sepan qué valores de nonce utiliza.
  • PERO cada nonce debe usarse solo una vez. Si dos clientes se conectan simultáneamente, cada uno tiene su propia identidad.
  • Es mucho mejor si las fuentes no son predecibles. Genere un nonce como una secuencia de al menos 16 bytes con un PRNG criptográficamente seguro .
  • Si su dispositivo tiene suficiente capacidad para hacerlo, es posible que desee cambiar a SSL (es decir, HTTPS). Dentro del túnel SSL, el dispositivo puede simplemente utilizar Autenticación básica , es decir, mostrar el "secreto" tal como está, Debido a que el túnel está cifrado y se realiza correctamente, SSL garantiza que el dispositivo esté convencido de hablar con el servidor correcto.

SSL es más pesado (no realmente para CPU, más para ancho de banda y latencia de red: un protocolo de enlace SSL es dos viajes de ida y vuelta, y luego uno más para la solicitud en sí), pero es bastante bueno para convencer a las personas sobre la seguridad. El uso de SSL le ahorra mucho esfuerzo a la hora de demostrar a algunos auditores que hizo las cosas correctamente. Además, le brinda confidencialidad, lo que podría ser bueno en su caso.

    
respondido por el Tom Leek 09.09.2013 - 22:21
fuente

Lea otras preguntas en las etiquetas