Trabajo como profesional de seguridad de TI (auditor de TI), por lo que puedo responder por experiencia.
Primero, definiré un token seguro. Para que el token de acceso sea seguro: deberá cumplir con lo siguiente:
- El token caduca en algún momento
- El token no se puede modificar en tránsito entre el cliente y el servidor.
- El usuario no puede modificar el token.
El token caduca en algún momento
Este requisito es el más fácil. Especifica una fecha en la que este token ya no será válido, en el lado del servidor. Si la fecha de inicio de sesión > fecha de vencimiento del token, luego rechace el token porque ha caducado.
El token no se puede modificar en tránsito entre el cliente y el servidor
A medida que esté utilizando TLS, (es de esperar que la versión 1.2 y la actualización a 1.3 cuando se finalice) este problema ya se haya resuelto. TLS proporciona confidencialidad , lo que garantiza que el token de acceso no se divulgue sin autorización a un tercero.
El usuario no puede modificar el token
Este requisito es el más difícil. Para acompañar esto, necesitaría usar una firma digital con PKI. No use SHA 1 como función de hash porque este algoritmo es INSECURE. La aplicación de la función de hash a los resultados del token de acceso en un resumen del mensaje. El resumen del mensaje se encripta utilizando la clave privada que solo el usuario conoce. Una vez que la credencial se descifra en el servidor utilizando la clave pública del usuario, si el mensaje resultante coincide con las credenciales del servidor, se garantiza que no se realizó ninguna modificación del token de acceso por parte del usuario.
El método anterior garantiza la C: confidencialidad y I: requisitos de integridad de la tríada CIA de seguridad. El no repudio (el usuario no puede negarlo son sus credenciales) también está garantizado debido a que la clave pública del usuario puede descifrar el mensaje cifrado recibido.
Para responder algunas de tus otras preguntas:
¿Debo cifrar el token de acceso localmente cuando esté almacenado?
Sí, deberías. Lo anterior corresponde a los datos en tránsito, pero no está en reposo . Si un pirata informático comprometiera la máquina cliente local, él o ella puede robar fácilmente un token de texto simple y luego hacerse pasar por el propietario legítimo.
¿Cómo debo cifrar?
Debería usar un algoritmo de cifrado fuerte como AES o RSA. Elija una longitud de clave larga (por ejemplo, 256) para maximizar la seguridad.