Tengo un problema de seguridad clásico en el que Alice debe demostrar su identidad a Bob pero con requisitos y restricciones bastante inusuales debido a un contexto M2M .
EDIT en negrita
El canal de comunicación utilizado entre Alice y Bob tiene las siguientes características:
- solo Alice puede enviar mensajes a Bob (Bob no puede hablar con Alice)
- los mensajes de Alicia tienen 4 bytes de longitud
- Bob deja de escuchar durante 10 minutos después de recibir 10 mensajes
- Alicia debe demostrar su identidad usando solo un mensaje, si es posible
Otros requisitos específicos son:
- Alice tiene bajo CPU & recursos de memoria , Bob tiene una alta CPU & memoria recursos
- El mensaje debe incluir la identidad de Alicia, pero sin la necesidad de ocultarlo
- Hay un número ilimitado de entidades Bob
- Hay < 4000 entidades como Alice que pueden autenticarse en cualquier Bob
- Los ataques de repetición deben prevenirse razonablemente (una repetición puede ser posible durante unos minutos después de la emisión pero no más)
- Está bien que Bob sea engañado por la fuerza bruta siempre que el adversario tarde en hacerlo (es decir, varios días de cómputo o de reintento del mensaje)
Esto es lo que se me ocurrió para el mensaje de Alice de 4 bytes:
bits 1-20 = truncate(HMAC(date.format(dd/MM/yy hh:mm)),20)
bits 21-32 = Alice ID (12bits = 4096 IDs)
Cuando Bob recibe el mensaje, si permitimos una desviación de X minutos entre el reloj de Alice y Bob, Bob calcula
truncate(HMAC(date.format(dd/MM/yy hh:mm)),20)
para X / 2 minutos después y antes de la recepción. Así que por ejemplo X = 10 minutos, Bob calcula 10 valores. Si uno de estos valores coincide con la emisión de Alicia, se autentica Alicia.
El adversario tiene X / 2 ^ 20 posibilidades de generar aleatoriamente el mensaje bueno. Ya que Bob solo escucha 10 mensajes cada 10 minutos, esto tomaría ~ 73 días en promedio si mis cálculos son correctos (para X = 10 minutos), lo cual está bien.
El ataque de repetición es posible durante X / 2 minutos.
La mayor probabilidad de colisión introducida al truncar el HMAC a 20 bits no compromete la clave privada ni reduce el nivel de seguridad del proceso AFAIK.
Soy un desarrollador, no un tipo de seguridad, ¿mi solución es razonable y mi análisis es correcto? ¿Ves uno mejor?