Actualmente estoy escribiendo una implementación de TOTP en PHP (pero esto también se aplica a otros lenguajes) y, por supuesto, quiero que sea lo más seguro posible, ¿qué se debe considerar?
Después de leer el RFC 6238 correspondiente y RFC 4226 mi implementación actualmente se ve así:
- Cada código utilizado solo se incluye en la lista negra durante 2 minutos, independientemente de si tuvo éxito o no
- El secreto es generado por un generador de números aleatorios seguro
- El código QR se genera en mi máquina y no se entrega a proveedores terceros
- Se requiere ingresar un reCaptcha para evitar ataques de fuerza bruta
- Los códigos se validan mediante una función de comparación resistente al ataque de tiempo
- Se verifican un total de 5 códigos (el actual, los dos últimos y los dos siguientes)
- Se genera un único código de rescate de 16 caracteres (mediante un generador de números aleatorios seguro) y solo se muestra una vez después de la activación exitosa, no puede ser recuperado por el usuario posteriormente
- A los usuarios se les pregunta solo una vez cada siete días en una máquina conocida (configurando una cookie)
- Los códigos de Secrets y Rescue se almacenan sin cifrar en la base de datos, pero esto no debería ser un problema, ya que el script debe descifrarlos de todos modos
¿Me faltan algunos importantes? ¿Algunos de los puntos son una mala decisión?