Uso de RSA para la autenticación de aplicaciones web

2

Tengo una red a la que solo se puede acceder a través de los servidores bastion a través de ssh. En él, estoy desarrollando aplicaciones web que están expuestas a los usuarios finales a través de GUIs servidas a través de websockets. Todo el tráfico que entra y sale de la red viaja a través de un túnel SSH desde cualquier host de servicio, a través del bastión, hasta la máquina del usuario final.

Por lo tanto, el tráfico desde el límite de la red hasta el cliente final ya está cifrado. Y, ya tengo una configuración del sistema para asociar usuarios finales con pares de claves SSH-RSA que se rotan periódicamente.

Entonces, aquí está mi idea loca:

En cualquier aplicación web en la red que requiera la autenticación del usuario, haga que el usuario final proporcione su nombre de usuario en la red, así como su clave pública. Haga que el servicio de autenticación de la aplicación web verifique que esta clave pública ya esté asociada con el usuario final en el almacén de claves de la red, luego genere un desafío utilizando la clave. Del lado del cliente, el usuario final descifra el desafío utilizando su clave privada y presenta el resultado final al servidor para la autenticación.

Aquí está el kicker: una carga de servicios en esta red se implementa en JavaScript en NodeJS. Debido a que NodeJS puede llamar a los servicios del sistema, puedo descargar el trabajo de generar desafíos utilizando claves públicas para un proceso más tradicional. Pero, desde el punto de vista del cliente, es posible que tenga que descifrar el desafío en el navegador usando la clave privada.

Poner la clave privada en el navegador es bastante fácil. El hecho de cargar o no la clave privada en un navegador es una buena idea es otra cuestión, por completo.

Pero, más específicamente:

  1. ¿Hay algún candente "Oh, no hagas eso!" fallas de seguridad en la configuración resumida arriba?
  2. ¿Cuáles son algunos paquetes estándar utilizados en Linux para generar desafíos usando una clave pública RSA?
  3. ¿Alguien sabe de un buen paquete para descifrar mensajes usando una clave RSA pública implementada en JavaScript ?
pregunta StudentsTea 24.07.2015 - 16:01
fuente

1 respuesta

1
  
  1. ¿Hay algún candente "Oh, no hagas eso!" fallas de seguridad en la configuración resumida arriba?
  2.   

El protocolo básico que está proponiendo es: el cliente se identifica a sí mismo, el servidor comprueba la clave pública y verifica que es un usuario válido, el servidor cifra un desafío mediante la clave pública, el cliente se desencripta para recuperar el desafío y lo devuelve como prueba de conocer la clave privada.

No veo ningún problema en llamas. Puede ser mejor seguir lo que hace SSH para la autenticación de clave pública como se muestra en RFC 4252, sección 7 . Allí, hacen que el cliente firme algo con la clave privada que el servidor puede verificar. Siempre es bueno seguir los estándares.

  
  1. ¿Cuáles son algunos paquetes estándar utilizados en Linux para generar desafíos usando una clave pública RSA?
  2.   

Si tiene openssl, haría esto openssl rand -base64 16 (o posiblemente 32 bytes).

De lo contrario, puede usar /dev/random (o posiblemente /dev/urandom si es absolutamente necesario). Algo como esto head -c 16 /dev/random | base64 . Vea esto para más detalles

  
  1. ¿Alguien sabe de un buen paquete para descifrar mensajes usando una clave RSA privada public implementada en JavaScript?
  2.   

Un número de estas bibliotecas admiten RSA. No estoy seguro de lo buenos que son y lo fácil que será transformar la clave privada de SSH en algo que puedan usar.

Esta respuesta es un resumen de nuestro chat

    
respondido por el mikeazo 24.07.2015 - 17:58
fuente

Lea otras preguntas en las etiquetas