He estado leyendo sobre 2FA y cómo se usa, y lo que más me llamó la atención es que todos parecen estar guardando el secreto TOTP como texto simple en su base de datos.
Entiendo que necesita el secreto como texto simple para verificar la OTP, por lo que no puede modificarlo, pero ¿no podría al menos cifrarlo de cierta manera, en caso de que su base de datos se filtre? Siento que hay maneras de hacer esto un poco más seguro, pero me pregunto si hay inconvenientes con las ideas que tengo.
- Cifre el secreto TOTP usando la clave almacenada en el servidor: Esto no sería ideal ya que estaría cifrando todo con la misma clave, pero se puede filtrar una base de datos sin que el atacante tenga acceso completo a todos archivos en el servidor. En ese escenario, al menos los secretos de TOTP aún están protegidos.
- Cifre el secreto TOTP utilizando la contraseña del usuario: cuando el usuario inicie sesión y la verificación de la contraseña sea válida, la misma contraseña que se envió podría usarse como clave para cifrar / descifrar el secreto TOTP. Cuando el usuario configura su 2FA por primera vez, debe ingresar su contraseña para que podamos usarlo para cifrar el secreto TOTP. Cuando inician sesión con una contraseña correcta, descifra el secreto TOTP utilizando la contraseña y valida la OTP. Si se filtra su base de datos, la contraseña está oculta y el secreto TOTP está cifrado, por lo que el atacante no tiene información sobre ninguna cuenta a menos que sepa la contraseña.
- Combine ambos métodos: combine la contraseña con una clave almacenada localmente, y use esto como la clave de cifrado para el secreto TOTP. De esta manera, si la base de datos tiene fugas y el atacante conoce la contraseña, aún no podrán descifrar el secreto TOTP a menos que tengan acceso a la clave almacenada
¿Hay algún error en esto, y si es así, cuáles son? Siento que cualquier cosa sería mejor que simplemente almacenar el TOTP como texto simple.