Amaya, miembro de este staff, nos ha hecho el favor de escribir esta reseña porque controla a la perfección este tema.
Solución:
Para Java 8 y superior, la solución más rápida y sencilla sería:
private static final SecureRandom secureRandom = new SecureRandom(); //threadsafe
private static final Base64.Encoder base64Encoder = Base64.getUrlEncoder(); //threadsafe
public static String generateNewToken()
byte[] randomBytes = new byte[24];
secureRandom.nextBytes(randomBytes);
return base64Encoder.encodeToString(randomBytes);
Ejemplo de salida:
wrYl_zl_8dLXaZul7GcfpqmDqr7jEnli
7or_zct_ETxJnOa4ddaEzftNXbuvNSB-
CkZss7TdsTVHRHfqBMq_HqQUxBGCTgWj
8loHzi27gJTO1xTqTd9SkJGYP8rYlNQn
El código anterior generará aleatorio string en codificación base64 con 32 caracteres. En la codificación Base64, cada carácter codifica 6 bits de los datos. Entonces, para 24 bytes del ejemplo anterior, obtienes los 32 caracteres. Puede cambiar la duración de la salida. string cambiando el número de bytes aleatorios. Esta solución es más segura que UUID
(que usa solo 16 bytes aleatorios) y genera string que podría usarse de forma segura en URL HTTP.
Para crear un token difícil de adivinar en el uso de Java 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 almacenar en caché un mapa usuario:token en la memoria o en una base de datos.
El esquema que está proponiendo le permite efectivamente a un cliente acceso ilimitado a su servicio. Después de un inicio de sesión inicial, el UID y el ‘ID de usuario’ 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 usar simplemente una HttpSession?
Aquí puedes ver las reseñas y valoraciones de los usuarios
Acuérdate de que tienes la opción de parafrasear tu experiencia si te ayudó.