Estoy creando una aplicación web que encripta los datos de cada usuario, utilizando AES-256, con una clave única para cada cuenta. Estoy pensando en agregar un inicio de sesión externo a través del esquema "Iniciar sesión con Google". Sin embargo, he investigado un poco y no estoy seguro de si es posible en mi situación.
En este momento, almaceno el hash de la contraseña del usuario con 10 iteraciones del hash Argon2, y proceso los inicios de sesión usando la comparación de hash incorporada Argon2. Como lo entiendo, Google OAuth2 reemplazaría esta parte muy bien. Sin embargo, es la siguiente parte que me preocupa.
Para cada usuario, genero una cadena aleatoria única de 50 caracteres utilizando Apache Commons RandomStringUtils.random (...); Función (incorporando ambas letras y números). Yo uso esta cadena como la clave de cifrado principal para la cuenta. Todo el contenido del usuario se encripta con esta clave. El cifrado real se realiza mediante el cifrado basado en contraseña de Spring AES, donde esta cadena de clave maestra se pasa como la contraseña de cifrado.
Pero aquí está el problema: luego genero un BCrypt Salt al azar (configurado para 12 iteraciones) único para cada usuario, y almaceno esta sal en bruto en el registro de la cuenta del usuario en la base de datos. Cuando el usuario crea su cuenta, tomo su contraseña de texto sin procesar y la pateo con BCrypt, utilizando su cuenta única de BCrypt salt. Este hash BCrypt de su contraseña de texto sin formato es la Meta-Key que utilizo para cifrar su clave maestra. Luego almaceno su clave maestra cifrada en su registro de base de datos de cuenta. Luego, cuando el usuario inicia sesión, tomo su contraseña de texto sin procesar, genero el hash nuevamente usando la sal almacenada en la base de datos y la uso como Meta-Key para descifrar su clave maestra de la DB. Luego, vuelvo a cifrar su clave maestra utilizando la clave privada global del servidor (la misma para todos los usuarios), y luego incrusté la clave maestra cifrada en el servidor en un token JWT y la envío al cliente para que actúe como su token sin estado. Cuando realizan una solicitud, devuelven el token, el servidor web extrae la clave maestra del token, la descifra con la clave privada global del servidor y la usa para descifrar los datos del usuario.
A menos que vea un error muy importante en mi diseño, mis preguntas son: si cambio a OAuth, el usuario ya no me proporcionará una contraseña, solo recibiré un token del proveedor de OAuth (Google en este caso). Pero ese token será diferente cada vez que inicien sesión. Necesito algo que sea único para cada usuario, que también sea estático y que sea exactamente el mismo cada vez que inicie sesión. Pero también debe ser privado y amp; no reproducible, por lo que no puedo usar algo como el GUID de su cuenta de Google (suponiendo que incluso te den acceso a algo así), porque eso sería accesible para otras aplicaciones / usuarios.
¿OAuth proporciona algún mecanismo para algún tipo de token / ID que sea privado y amp; ¿Único para el usuario / par de aplicaciones, y también estático a través de inicios de sesión separados? En este punto, llego a la conclusión de que OAuth es imposible en mi situación, pero pensé que vería si alguien tuviera alguna idea. Estoy abierto a rediseñar mi proceso de seguridad, pero debe mantener una clave de cifrado única para cada usuario.
Gracias por tu tiempo.
-Yurelle