Voy a aplicar JWT en mi API REST desarrollada con Java-Jersey. Estoy usando esta biblioteca para JWT - https://github.com/auth0/java-jwt
Tengo algunas preguntas sobre el JWT - Secreto
Secret tiene que ser único?
- ¿Este
Secrettiene que ser único?
Debe ser único para su aplicación (después de todo, debe ser un secreto ), pero no será único para cada token. Más bien, debe tener una cantidad relativamente pequeña de claves secretas en un momento dado (p. ej., generalmente solo tiene una clave, pero tiene períodos breves en los que tiene dos claves a medida que cambia de una a la siguiente).
- ¿Debo usar la versión codificada de la contraseña del usuario para el secreto?
No, por dos razones:
GoPackers123 . Usar la contraseña en su secreto significa que alguien puede probar fácilmente una contraseña potencial determinada para ver si da como resultado la firma correcta; y, más concretamente, pueden probar fácilmente una gran cantidad de contraseñas potenciales para ver si alguna de ellas da la firma correcta. Este es un ataque fuera de línea, por lo que nunca sabrás que sucedió.JWT y la biblioteca java-jwt admiten algoritmos simétricos y asimétricos para la firma:
Si elige algoritmos simétricos como HS256, solo tendrá una clave para firmar y verificar la firma.
Si considera algoritmos asimétricos como RS256, tendrá una clave pública y otra privada. Mantenga la clave privada segura en el servidor y utilícela para firmar el token. Use la clave pública para verificar la firma (también se puede compartir con quien necesite verificar la firma).
¡ Nunca comparta la clave utilizada para firmar el token!
Y nada te impide tener un conjunto de claves diferentes para firmar tus tokens. En esta situación, el parámetro de encabezado kid se puede usar para indicar qué clave se usó para firmar el token. Se supone que esta notificación lleva un identificador de clave y no la clave en sí.
Consulte esta respuesta para obtener más detalles sobre el reclamo de kid .
Utilice RSA256, es decir, un par de claves privada/pública (no se requiere 'secreto'). De esa manera, puede mantener la clave privada en secreto y segura (solo se usará para firmar el token) y puede usar la clave pública para verificar que la firma sea correcta.
Puede dar la clave pública a cualquier persona o servicio que necesite verificar que la firma del token sea correcta.