Su pregunta parece ser sobre qué hace Facebook y qué se podría hacer. No sé qué hace FB, pero puedo intentar hacer algunas buenas suposiciones sobre lo que hace que un sistema sea seguro. Espero que eso ayude.
Déjame intentar reformular lo que Facebook está haciendo. Los sitios generalmente admiten un factor de autenticación único , algo que usted sabe (es decir, su contraseña) ). En los sitios que admiten una funcionalidad de "recordarme", use el factor algo que usted tiene (el "algo" es la cookie en su navegador). Esto puede ser más débil, ya que cualquier persona con acceso a su navegador, incluso un atacante remoto, puede iniciar sesión como usted. Pero no tener que escribir su contraseña cada vez que accede a un sitio, especialmente si tiene una contraseña segura, es una molestia. Así que Facebook está eligiendo un término medio, básicamente tiene una función de "recordarme" de dos factores en la que necesita el nonce ( algo que tiene ) y su PIN ( algo que sabe ).
- ¿Qué podría estar almacenando el servidor? ¿Un hash del nonce + PIN?
Es muy probable que Facebook esté almacenando un hash del nonce + PIN. Tenga en cuenta que esto podría ser un hash simple y seguro en lugar de algo así como la función de almacenamiento de contraseñas bcrypt más compleja. Un hash como SHA512 es irreversible cuando se opera en cadenas de datos grandes, criptográficamente aleatorias. El nonce es (presumiblemente) tal número aleatorio.
- ¿Cómo podría el servidor validar los intentos de inicio de sesión de PIN?
El servidor simplemente rehace el hash y lo compara con el campo apropiado en la base de datos.
- ¿Hay implementaciones de referencia para un sistema como este que pueda ver?
No que yo sepa, tal vez otros puedan ayudar.
- Suponiendo que el atacante no tome el contenido almacenado en el navegador, ¿es posible que este sistema sea al menos tan seguro como la autenticación tradicional de nombre de usuario / contraseña? Si no, ¿a qué tipo de ataque sería más vulnerable?
Si hacemos que suposición realmente grande e infundada , este sistema es más seguro que uname / pwd regular, ya que tiene el efecto de hacer que la contraseña concatene un número aleatorio criptográficamente seguro, el nonce , y el PIN. Las contraseñas de números aleatorios seguras criptográficamente son muy fuertes.
Pero, en el mundo real, nunca se puede suponer que los datos del navegador sean seguros, por lo que la seguridad de este mecanismo se reduce a la seguridad del PIN y del nonce. Eso es difícil de concretar. Esto es definitivamente más seguro que la simple funcionalidad "recordarme". Si los datos de su navegador son razonablemente seguros, esto puede ser más seguro que las contraseñas estándar. De lo contrario, las contraseñas estándar pueden ser más seguras. En casi cualquier situación, esto supera las contraseñas débiles debido al factor algo que tiene .
Algunos puntos de nota:
- El servidor debe realizar el hash. Si el cliente hiciera el hash, entonces una tabla de base de datos robada podría usarse como credenciales de inicio de sesión. Esto no puede suceder con el servidor que realiza el hash porque el hash es irreversible.
- Se podría agregar seguridad adicional mediante el uso de una función de almacenamiento de contraseñas como bcrypt en lugar de un hash estándar. Esto solo es necesario si usas un nonce más corto. Los nonces más largos brindarán protección suficiente contra un ataque de fuerza bruta, incluso si se usa un simple SHA512 (o similar).
- Creo que tiene sentido registrar los intentos fallidos en los inicios de sesión de PIN y, luego de 3 intentos fallidos, elimine el PIN de su base de datos y obligue al usuario a iniciar sesión con su contraseña. Esto proporciona mucha protección contra una búsqueda de diccionario para el PIN, incluso en el caso de que no haya fugas, ya que el PIN se volverá inútil. Incluso si el usuario reutiliza el mismo número que un nuevo PIN en su próximo inicio de sesión, obtendrán una nueva fuente que un atacante necesitará robar para probar más posibilidades de PIN.