una segura por parte net generar ejemplo construyendo con basada autenticacion java security rest authentication token

segura - generar token java



Cómo crear un token de autenticación usando Java (4)

El plan que está proponiendo efectivamente le permite a un cliente acceso ilimitado a su servicio. Después de un inicio de sesión inicial, el UID y ''userid'' estarán disponibles para el cliente, que se pueden combinar simplemente con una marca de tiempo siempre válida.

Si necesita un servicio con ''inicio de sesión'' y un token de sesión, ¿por qué no simplemente usar una HttpSession?

En mi servicio REST de Java EE6, quiero usar tokens de autenticación para iniciar sesión desde dispositivos móviles, el usuario enviará su nombre de usuario, contraseña y el servidor enviará un token, que se utilizará para autorizar al usuario en sus solicitudes adicionales para un determinado hora.

¿Puedo simplemente crear un token yo mismo así? (Supongo que no necesito encriptar esto ya que usaré HTTPS).

String token = UUID.randomUUID().toString().toUpperCase() + "|" + "userid" + "|" + cal.getTimeInMillis();

¿O hay una manera más estándar de crear mis tokens? tal vez existe en uno de API


REST se basa en HTTP y fomenta el uso del protocolo subyacente en lugar de reinventar la rueda. HTTP usa cookies para admitir interacciones con estado, como recordar la autenticación, y también admite la autenticación de nombre de usuario y contraseña.

Además, Java EE es compatible con todo esto fuera de la caja. Ver el tutorial

http://docs.oracle.com/javaee/6/tutorial/doc/bncas.html


Existe una forma de crear tokens que no se puede comprometer pero que también se puede usar para la autenticación.

Crea un token que se combina:

base64 (nombre de usuario + caducidad + otros valores para el cliente + 3des codificados (nombre de usuario, caducidad, fuente IP, identificador del navegador, otros valores para el cliente))

El cliente puede usar el token para autenticar la solicitud, por ejemplo, el uso de JSON Web Token (RFC 7515).

En el lado del servidor, las teclas que se usan para la codificación 3des se pueden rotar con el tiempo, como token. Cada solicitud contiene token para autenticación y cada respuesta contiene el mismo token o uno nuevo antes de la caducidad.

En ese caso, el token contiene el nombre de usuario, de modo que al solicitar autenticación solo tiene que comprobar que la parte codificada 3des es válida o no (igual que, el origen de la solicitud es el mismo. En este caso, si alguien robó el token, la usabilidad del token es más limitado como identificador de sesión. Puede componer otros identificadores para token, como navegador, etc. Más difícil para la solicitud falsa, porque el atacante tiene que falsificar más cosas, lo cual es desconocido para él, porque no sabe qué está codificado en la parte de token. (De hecho, no existe una seguridad perfecta, solo puede ser más difícil de descifrar)

Los pros de esta solución son:

  • Cada pieza es estándar, pero no el todo junto y el atacante tiene que conocer los detalles de implementación para poder atacar.
  • El lado del cliente puede usar partes del token para mostrar información del token mientras que el token está protegido porque cada parte no encriptada está contenida en una parte cifrada, por lo que no se puede modificar sin la invalidación del token en el servidor, por lo que es fácil detectar un ataque.
  • No hay necesidad de replicación de sesión / sesiones adhesivas para la agrupación. Las 3des claves son suficientes para replicar entre nodos, por lo que son adecuadas para estrategias de backend sin estado.

Los contras son

  • Más difícil de implementar en el lado del servidor, porque para esta solución hay que implementar el algoritmo de generación / validación de tokens en el lado del servidor. Para ese servidor se recomienda el filtro.

  • Los clientes tienen que implementar la tienda de tokens, en lugar de que se recomienda la tienda de cookies del navegador de sesión, es más fácil robar las cookies.

  • Asegúrese de que las claves 3des estén lo suficientemente seguras. Se recomienda usar la seguridad de Java para evitar el compromiso.

Para crear un token difícil de adivinar en Java, use java.security.SecureRandom

P.ej

SecureRandom random = new SecureRandom(); byte bytes[] = new byte[20]; random.nextBytes(bytes); String token = bytes.toString();

En lugar de incluir el nombre de usuario en el token, sería mejor guardar en caché un usuario: token map en la memoria o en una base de datos.