Tengo un requisito de aplicaciones OTP en dispositivos móviles que no comparten el mismo secreto (incluso si los dispositivos móviles son propiedad del mismo usuario). Un solo secreto debe estar presente en un solo dispositivo.
Las aplicaciones de código abierto que implementan OTP (como Google Authenticator y FreeOTP) no satisfacen mi requisito: el secreto no es exclusivo del dispositivo, ya que puedo escanear el código QR con más de un dispositivo y el backend nunca lo sabrá sobre eso. Creo que no es algo relacionado con la aplicación en sí, sino con el RFC 4226 que no especifica este requisito.
Así que pensé en un proceso para mitigar el riesgo de que los usuarios usen el secreto OTP en más de un dispositivo (necesita conexión a Internet, no es un requisito estar fuera de línea). Los pasos:
- La aplicación genera una clave de protección secreta única en la primera ejecución
- La aplicación envía la clave de protección secreta al servidor
- El servidor genera un secreto único para la aplicación
- El servidor cifra el secreto usando la clave de protección secreta de la aplicación y devuelve el blob a la aplicación
- La aplicación descifra la información usando la clave generada y comienza a generar OTP
- Tanto la clave secreta cifrada como la clave secreta de protección se almacenarán en la aplicación
Sé que este enfoque no es a prueba de manipulaciones y que el secreto podría restaurarse desde el almacenamiento, pero sería más difícil.
Sobre todas las explicaciones aquí, mis preguntas son:
- ¿Sería un buen enfoque intercambiar el secreto de OTP a través de la web, incluso si está protegido por TLS?
- ¿La protección secreta única agrega seguridad o una falla al proceso?
- ¿Sería posible lograr un resultado similar en una sincronización sin conexión?
- ¿Existen marcos de código abierto para lograr una mejor protección de la clave secreta ( es decir, no se expone directamente al usuario, como lo hace QR-Code)?