Realmente no describe este paso muy bien:
Si se confirman las credenciales de inicio de sesión del usuario, se genera una clave AES-128 simétrica a partir de su contraseña no cifrada y su sal única y se adjunta a su sesión para descifrar las credenciales de las cuentas de terceros almacenadas en la base de datos.
¿Exactamente cómo se crea esa clave de 128 bits? Ese debería ser un proceso muy lento, de lo contrario, está proporcionando un canal lateral para forzar las contraseñas de los usuarios. La forma en que funcionaría es que un atacante tenga en sus manos su base de datos. En lugar de intentar forzar la fuerza bruta de los hash bcrypt, que consumirían mucho tiempo, pueden trabajar con las contraseñas encriptadas. Simplemente aplican fuerza bruta a la contraseña del usuario para obtener las claves que parecen funcionar (es decir, el texto descifrado se parece a las contraseñas, sea lo que sea). Este será un ataque rápido porque el cifrado es rápido.
Es necesario que la creación de la clave de 128 bits sea un proceso lento. La mejor manera de hacer esto es probablemente usar bcrypt. Pero, como probablemente se haya dado cuenta, no desea utilizar el valor bcrypt que ha almacenado en la base de datos para la autenticación, ya que no sería una forma segura de almacenar las claves de cifrado. Le sugiero que guarde una segunda sal para cada usuario. Luego utiliza esa sal, más su contraseña de texto simple, en una llamada a bcrypt para generar la clave de cifrado de 128 bits.
Cuando un usuario cambia las contraseñas, debe borrar o volver a cifrar todas las contraseñas cifradas. Esto es necesario porque los usuarios cambian con frecuencia las contraseñas cuando les preocupa que su contraseña haya sido comprometida. Así que es mejor que borres los datos cifrados con la contraseña comprometida. Aunque esto, por supuesto, no ayudará si el atacante ya tiene una copia de la base de datos antes del cambio de contraseña.
Otra medida de seguridad que podría agregar es salpicar (busque "pimienta" en esta respuesta ) el cifrado llave. El pimiento debe ser una cadena de bits realmente aleatoria (no, el nombre de tu gato no califica) que guardes en otro lugar . Es decir, no está en la base de datos. El uso de un pimiento evitará que un atacante que obtiene una copia de la base de datos y de la contraseña de un usuario, descifre los datos del usuario ya que todavía necesitarán el pimiento. Recuerde que un pimiento es tan útil como seguro. Ponerlo en el repositorio de origen es probablemente una mala idea.