Tengo una serie de requisitos aparentemente contradictorios:
1) Obtenemos contenido para usuarios de terceros; El contenido para ciertos usuarios debe almacenarse encriptado en reposo por razones de cumplimiento
2) El usuario debe poder descifrar y mostrar su contenido a través de una aplicación / api segura
3) Hay muchos usuarios en una cuenta determinada, y todos deberían poder descifrar y ver el contenido de cada uno (lo que implica una clave compartida)
4) Un proceso de trabajo de back-end debería poder descifrar y reprocesar el contenido del usuario en cualquier momento, si queremos (por ejemplo) mejorar nuestra analítica
Si tuviéramos que hacerlo, podríamos sacrificar el # 4 (o quizás hacer que el usuario se autentique para permitirlo).
Naturalmente, no quiero almacenar la clave de cifrado en texto sin formato en cualquier lugar. Sería más conveniente almacenarlo a nivel de usuario, cifrado por un hash PBKDF2 de su contraseña, pero eso introduce un flujo de trabajo incómodo si olvidan su contraseña y necesitan restablecerla (ya que ahora ya no podemos obtener la clave). .)
Tampoco puedo usar la contraseña, porque el acceso al contenido que ya estaba cifrado debería sobrevivir a las solicitudes de cambio de contraseña. Además, por supuesto, no tenemos acceso a la contraseña de texto sin formato en los trabajos async backend worker.
¿Hay una forma generalmente aceptada de hacer esto? P.ej. ¿Podría usar algún tipo de flujo de trabajo 2FA-ish para recuperar un secreto de usuario que nunca almacene localmente, pero que se usa para proteger la clave?