conexión Bluetooth segura de Arduino a Android

3

Estoy usando un Arduino Uno y un La placa nRF8001 de Adafruit se conecta a un teléfono Android a través de Bluetooth. Lo utilizaré para bloquear y desbloquear un bloqueo y debo asegurarme de que solo los dispositivos verificados puedan iniciar el bloqueo y desbloqueo. He buscado alrededor de un grupo y tengo problemas para encontrar un ejemplo claro de lo que debo hacer para verificar el dispositivo de conexión. Actualmente tengo el Arduino conectado al bloqueo y cada vez que el teléfono Android se conecta, se puede bloquear y desbloquear.

Soy bastante nuevo en criptografía y alguna orientación sería útil. Por lo que he leído, parece que el hashing md5 está roto y no es la solución correcta para mi problema. He encontrado SipHash y parece ser lo más parecido a lo que pueda necesitar. El proceso que tenía en mente es el siguiente.

  1. Android intenta conectarse al Arduino
  2. Arduino ve la solicitud y envía una cadena aleatoria al dispositivo Android
  3. El Android cifra la cadena con una clave secreta compartida y la envía al Arduino
  4. El Arduino descifra la cadena cifrada y verifica que coincida con el original que envió; si lo hace, sigue adelante y se conecta / continúa con el bloqueo o desbloqueo.

¿Estoy en el camino correcto con SipHash y el proceso anterior? ¿Hay una manera mejor y más común de hacer esto? Después de buscar por aquí encontré información aquí. Parece que debería preocuparme por los ataques del hombre en el medio y la falsificación de MAC. Solo revisaría la dirección MAC como verificación, pero por lo que recuerdo, es muy fácil falsificar las direcciones MAC. Cualquier ayuda sería apreciada.

    
pregunta BlueBeardo 27.12.2014 - 03:27
fuente

1 respuesta

2

Tienes la idea correcta, es decir, un secreto compartido que nunca se transmite de un dispositivo a otro. Si lo haces, no deberías preocuparte por las direcciones MAC o los ataques MITM. Solo eres vulnerable si el atacante puede obtener ese secreto compartido.

Dado que el secreto compartido es la clave {ejem} , debe tener la seguridad de que no se puede generar de forma independiente. Una forma de hacerlo es generarlo con un generador de números pseudoaleatorios criptográficamente seguro ( CSPRNG ). También puede considerar usar las palabras Diceware , que son algo más amigables para los humanos, pero necesitarán una cadena más larga para obtener igual entropía.

Ahora, sobre el algoritmo real: SipHash es nuevo para mí, pero una pequeña lectura me dice que es una función hash con clave. Es decir, no es invertible, por lo que el paso 4. no funcionará como lo has escrito.

Si SipHash está dado, entonces el Paso 3 es "El Android pulsa la cadena con una clave secreta compartida y la envía de vuelta al Arduino".

El paso 4 es la diferencia real: "Arduino calcula el mismo hash y verifica que coincide con el hash recibido de Android; si lo hace, continúa y se conecta / continúa con el bloqueo o desbloqueo".

Alternativamente, podría usar cifrado simétrico, como AES. Un poco de Google busca bibliotecas AES para Arduino y sé que existen para Android.

    
respondido por el Bob Brown 27.12.2014 - 05:12
fuente

Lea otras preguntas en las etiquetas