Tengo una aplicación web y tengo la tarea de agregar un inicio de sesión seguro para reforzar la seguridad, similar a lo que Google ha agregado a las cuentas de Google.Autorización de una computadora para acceder a una aplicación web
caso de uso
En esencia, cuando un usuario inicia una sesión, queremos detectar si el usuario ha autorizado previamente este equipo. Si la computadora no se ha autorizado, al usuario se le enviará una contraseña de un solo uso (por correo electrónico, SMS o llamada telefónica) a la que debe ingresar, donde el usuario puede elegir recordar esta computadora. En la aplicación web, realizaremos un seguimiento de los dispositivos autorizados, lo que permite a los usuarios ver cuándo y dónde iniciaron sesión desde ese dispositivo, y desautorizar los dispositivos si así lo desean.
Requerimos una solución que sea muy ligera (es decir, que no requiera instalación de software del lado del cliente), y que funcione con Safari, Chrome, Firefox e IE 7+ (desafortunadamente). Ofreceremos seguridad x509, que brinda la seguridad adecuada, pero aún necesitamos una solución para los clientes que no pueden o no quieren usar x509.
Mi intención es almacenar información de autorización usando cookies (o, potencialmente, usando almacenamiento local, degradando a flash cookies, y luego cookies normales).
A primera vista
pista dos valores separados (datos o galletas locales): un hash que representa una, así como un contador dispositivo contador de sesión segura. Ambos valores son impulsados (y grabados) por la aplicación web y dictados al cliente. La ficha de SSO depende del dispositivo así como de un número de secuencia. Esto efectivamente permite que los dispositivos sean desautorizados (todos los tokens SSO se vuelven inválidos) y mitiga la repetición (no de manera efectiva, por lo que estoy haciendo esta pregunta) a través del uso de un número de secuencia, y usa un nonce.
Problema
Con esta solución, es posible que alguien acaba de copiar los SSO y fichas de dispositivos y su uso en otra solicitud. Si bien el número de secuencia me ayudará a detectar dicho abuso y, por lo tanto, desautorizar el dispositivo, la detección y la respuesta solo pueden ocurrir después de que el dispositivo válido y la solicitud maliciosa intenten acceder, lo cual es tiempo suficiente para que se produzcan daños.
Tengo ganas de usar HMAC sería mejor. Rastree el dispositivo, la secuencia, cree un nonce, timestamp y hash con una clave privada, luego envíe el hash más esos valores como texto sin formato. El servidor hace lo mismo (además de validar el dispositivo y la secuencia) y lo compara. Eso parece mucho más fácil y mucho más confiable ... suponiendo que podamos negociar, intercambiar y almacenar claves privadas de forma segura.
Pregunta
Entonces, ¿cómo puedo negociar de forma segura una clave privada para el dispositivo autorizado, y luego almacenar de forma segura esa clave? ¿Es más posible, al menos, si me conformo con almacenar la clave privada usando almacenamiento local o flash cookies y simplemente digo que es "lo suficientemente bueno"? O bien, ¿hay algo que pueda hacer con mi borrador original para mitigar la vulnerabilidad que describo?
Utilizaremos una contraseña de un solo uso para las máquinas "no reconocidas", o aquellas cuyas reclamaciones fallan. En cuanto a las otras sugerencias, como mencioné en la pregunta, tengo que implementar un "toque ligero" (lo que significa que no requiere software adicional); de lo contrario, habría seguido ese camino. Mi solución original propone un "mejor esfuerzo" a la luz del hecho de que, como dijiste, no puedo controlar al cliente dadas las limitaciones que se me otorgan, y si todo lo demás falla, marcamos la cuenta y exigimos la verificación 1TP. – HackedByChinese
Sin embargo, menciona detectar cuando el sistema se ha movido. Pensé en usar una IP geo IP para registrar la ciudad aproximada de un usuario. Ampliando eso, tal vez pueda emplear heurística sobre la dirección IP del cliente para tratar de detectar un comportamiento extraño, volviendo a la verificación de 1TP cuando se detecta algo desagradable. Para clientes realmente móviles, solo podríamos requerir x509 auth o la instalación del software del cliente. De todos modos, gracias por poner el tiempo en pensar sobre esto. – HackedByChinese
Me alegra ayudar. Acabo de encontrar otras dos preguntas más relevantes que podrían darle algunas ideas: [identificación única de una computadora] (http://stackoverflow.com/questions/671876/whats-a-good-way-to-uniquely-identify-a- computadora/671914 # 671914) y [huella digital del dispositivo para acceso de cliente seguro a través de una red] (http://stackoverflow.com/questions/7649074/device-fingerprint-for-secure-client-access-over-tls-network). –