Compartiendo un JWT entre dispositivos que están muy cerca unos de otros

1

Configuración:

  • iPhone (supongamos que es 6 y más reciente por el bien de esta pregunta).
  • Raspberry Pi 2.

La frambuesa ejecuta un servicio web REST que el iPhone consulta. El servicio web utiliza JSON Web Tokens para la autenticación y autorización. Estoy tratando de encontrar una forma tan segura como sea posible para que el iPhone obtenga un JWT de la Raspberry sin demasiados problemas para el usuario, pero la seguridad es más importante que la facilidad de uso.

Los dos dispositivos operarán cerca uno del otro, por lo que el intercambio de token sobre un canal físicamente restringido parece una buena solución, ya que un atacante debe estar físicamente presente antes de (por ejemplo, dejar un dispositivo que pueda detectar y transmitir la información). utilizando un canal diferente) o durante el intercambio de tokens.

Como el iPhone no ofrece a los desarrolladores acceso al chip NFC, esta no es una opción (también he leído en otros lugares que es vulnerable a ataques MITM a una distancia de hasta 10 metros).

La comparación numérica de Bluetooth parece ser una opción posible, ya que ha sido comprobada como segura (al menos para v2.1).

P1: ¿Sigue siendo válido? ¿Puede la comparación numérica de Bluetooth ser considerada segura en Bluetooth 4.x?

No es ideal tener que vincular dispositivos, ya que un iPhone solo interactuará con la Raspberry durante unos días y luego será reemplazado por un nuevo iPhone que interactúa con la misma Raspberry Pi. Me gustaría evitar tener que limpiar la lista de dispositivos emparejados de la Raspberry a diario.

He estado pensando en una solución personalizada en la que generaría un valor aleatorio (seguro) que se mostraría en una pantalla conectada a la Raspberry Pi. Esto serviría como un token de corta duración que el usuario del iPhone ingresaría manualmente, y la aplicación enviaría una solicitud de autenticación al servicio web utilizando este valor. El servicio web mantendría un temporizador para asegurarse de que el token de vida corta solo pudiera intercambiarse por un JWT real dentro de un corto período de tiempo (por ejemplo, 5-10 minutos) para evitar ataques de fuerza bruta. Podemos suponer que se puede usar una PKI para configurar una conexión SSL entre la Raspberry Pi y el iPhone, de modo que el intercambio del token de corta duración por un JWT de larga duración se realizará de forma segura.

P2: Sé que diseñar soluciones de seguridad personalizadas es una idea horrible y debe dejarse en manos de expertos en seguridad. Sin embargo, la estrategia propuesta parece muy simple, pero debe ser defectuosa, y me gustaría saber por qué es defectuosa.

    
pregunta Janus Varmarken 22.09.2016 - 20:33
fuente

1 respuesta

2

Respuesta a Q2:

Realmente no estás inventando algo aquí por lo que puedo ver. Está utilizando un generador de código de una sola vez muy simple.

Genere el código localmente en el Pi, manténgalo válido por un período de tiempo limitado (quizás unos segundos), requiera que se ingrese en el teléfono y una vez que lo use invalide de inmediato.

Use el Pi como un punto de acceso Wi-Fi local con la seguridad adecuada y debería ser más que suficiente para la entrada y salida rápidas que necesita. Incluso si alguien se conecta a la red Wi-Fi, siempre que el resto esté asegurado con HTTPS y su OTP, debería estar bien.

Para ahorrar trabajo y evitar el problema de la invención local, use un conjunto estándar de bibliotecas en el Pi. Node.JS con ExpressJS y módulos estándar como Passport, Helmet, Lusca o similares pueden manejar el inicio de sesión y la seguridad de la aplicación. Un certificado generado localmente debería ser suficiente para HTTPS.

Esto parece ser un buen enfoque simple, estándar y razonablemente seguro.

    
respondido por el Julian Knight 22.09.2016 - 21:33
fuente

Lea otras preguntas en las etiquetas