Compartir credenciales cifradas entre aplicaciones en el mismo sistema

0

Tenemos una aplicación web basada en java que se ejecuta localmente en las máquinas cliente, como si fuera una aplicación de escritorio. Después de autenticar al usuario, ciframos y almacenamos sus credenciales en la sesión de Spring porque tenemos una función que permite al usuario abrir una aplicación externa (también desarrollada por nosotros) y se espera que las autentifiquemos automáticamente.

Nuestro problema surgió porque tenemos desacuerdos sobre la forma más segura de manejar este proceso de transferencia.

Aquí hay un resumen del proceso, que desafortunadamente se decidió sin nuestro aporte. Al final, realmente voy a pedir sugerencias para un mejor proceso, pero también estoy buscando que rompa esto si se lo merece. Retendré nuestros propios pensamientos por ahora.

Lado del cliente

  1. Cuando un usuario hace clic (un enlace en nuestra aplicación web) para iniciar una aplicación externa, generamos un valor de sal a partir de una fecha yyyMMddmm y lo pasamos al servidor.

Server Side (Java)

  1. El java sha-1 contiene una clave secreta aes.
  2. El java sha-1 contiene el resultado del paso 2, con la sal basada en la fecha.
  3. Utilizamos los primeros 128 bits como clave de cifrado AES. Encriptamos (y codificamos en hexadecimal) el nombre de usuario, contraseña y sal.
  4. El resultado se pasa a la aplicación externa.

Lado de la aplicación (C)

  1. Realizamos un ciclo para "adivinar" qué era la sal (en un intervalo de minutos antes de "ahora").
  2. Se genera una sal en el formato yyyyMMddmm .
  3. El C sha-1 contiene la clave secreta de aes.
  4. El C sha-1 contiene el resultado del paso 8, con la sal basada en la fecha.
  5. Utilizamos los primeros 128 bits como clave de cifrado AES. Encriptamos (y codificamos en hexadecimal) la sal.
  6. Si la sal no coincide con la sal encriptada proporcionada por Java, el bucle continúa.
  7. Si la sal coincide, intentamos descifrar las credenciales del usuario.

Fuera del hecho de que todo esto sucede en un solo sistema y si un usuario tiene acceso no autorizado, tendría acceso a todo lo necesario para capturar y descifrar las credenciales. Creemos que se puede hacer mucho para mejorar. este proceso. "Adivinar" una sal se siente como una elección terrible y todo esto es demasiado complejo y se siente mucho más "seguro" de lo que realmente es.

Algunas preguntas específicas:

  • ¿Existe una mejor manera de cifrar y entregar datos cuando todo sucede en un solo sistema?
  • Usar una sal que es simplemente la fecha es una mala práctica, ¿cuál es una mejor práctica?
  • ¿Hay alguna inquietud con la codificación de todo con hex frente a base64, especialmente cuando se usan direcciones URL de protocolo externo?
  • ¿Está mal visto "salpar una sal consigo mismo"?
pregunta helion3 13.12.2016 - 20:30
fuente

0 respuestas

Lea otras preguntas en las etiquetas