oauth unix-timestamp nonce

¿Cuál es el sentido de una marca de tiempo en OAuth si un Nonce solo puede usarse una vez?



unix-timestamp (4)

Es razonable suponer que uno podría intentar romper el nonce con la fuerza bruta. Una marca de tiempo reduce la posibilidad de que alguien tenga éxito.

En un principio, malinterpreté la implementación de la marca de tiempo de OAuth y pensé que significaba que se negaría una marca de tiempo que no estaba dentro de los 30 segundos posteriores a la hora actual. Resultó que esto era incorrecto por algunas razones, incluido el hecho de que no podíamos garantizar cada reloj del sistema estaba sincronizado lo suficiente como para los minutos y segundos independientemente de la zona horaria. Luego lo leí nuevamente para obtener más claridad:

"A menos que el proveedor de servicios especifique lo contrario, la marca de tiempo se expresa en el número de segundos desde el 1 de enero de 1970 00:00:00 GMT. El valor de la indicación de tiempo DEBE ser un entero positivo y DEBE ser igual o mayor que la marca de tiempo utilizada en solicitudes ".

fuente: http://oauth.net/core/1.0/#nonce

Lo que significa que las marcas de tiempo solo se comparan en relación con las solicitudes anteriores de la misma fuente, no en comparación con el reloj de mi sistema de servidor.

Luego leo una descripción más detallada aquí: http://hueniverse.com/2008/10/beginners-guide-to-oauth-part-iii-security-architecture/

( TL; DR? - salte a las partes en negrita a continuación)

Para evitar que se vuelvan a usar las solicitudes comprometidas (reproducidas), OAuth usa un nonce y una marca de tiempo. El término nonce significa ''número utilizado una vez'' y es una cadena única y generalmente aleatoria que está destinada a identificar de manera única cada solicitud firmada. Al tener un identificador único para cada solicitud, el Proveedor de servicios puede evitar que las solicitudes se utilicen más de una vez. Esto significa que el consumidor genera una cadena única para cada solicitud enviada al proveedor de servicios, y el proveedor de servicios realiza un seguimiento de todas las nonces utilizadas para evitar que se utilicen por segunda vez. Como el valor nonce está incluido en la firma, no puede ser modificado por un atacante sin conocer el secreto compartido.

El uso de nonces puede ser muy costoso para los proveedores de servicios ya que exigen el almacenamiento permanente de todos los valores de nonce recibidos. Para facilitar las implementaciones, OAuth agrega un valor de marca de tiempo a cada solicitud, lo que permite al Proveedor de Servicios mantener solo los valores nonce por un tiempo limitado. Cuando una solicitud entra con una marca de tiempo que es anterior al marco de tiempo retenido, se rechaza ya que el Proveedor de servicio ya no tiene nonces de ese período de tiempo. Es seguro asumir que una solicitud enviada después del límite de tiempo permitido es un ataque de repetición. OAuth proporciona un mecanismo general para implementar las marcas de tiempo, pero deja la implementación real a cada proveedor de servicios (un área que muchos creen que debería ser revisada por la especificación). Desde el punto de vista de la seguridad, el nonce real es la combinación del valor de la marca de tiempo y la cadena nonce. Solo juntos proporcionan un valor único perpetuo que nunca puede ser usado nuevamente por un atacante.

La razón por la que estoy confundido es si el Nonce solo se usa una vez, ¿por qué el Proveedor de servicios alguna vez lo rechazaría en base a la marca de tiempo? "El proveedor de servicios ya no tiene nonces a partir de ese período de tiempo" me resulta confuso y suena como si se pudiera volver a utilizar un nonce siempre que sea dentro de los 30 segundos de la última vez que se usó.

Entonces, ¿alguien puede aclararme esto? ¿Cuál es el sentido de la marca de tiempo si el nonce es un uso único y no estoy comparando la marca de tiempo con el reloj de mi sistema (porque obviamente no sería confiable)? Tiene sentido que las marcas de tiempo solo sean relativas entre sí, pero con el requisito único de nonce parece irrelevante.


La marca de tiempo se utiliza para permitir que el servidor optimice su almacenamiento de nonces. Básicamente, considere la lectura de nonce como la combinación de la marca de tiempo y la cadena aleatoria. Pero al tener un componente de marca de tiempo separado, el servidor puede implementar una restricción basada en el tiempo usando una ventana corta (digamos, 15 minutos) y limitar la cantidad de almacenamiento que necesita. Sin marcas de tiempo, el servidor necesitará un almacenamiento infinito para que no se pierda nunca.

Digamos que decides permitir hasta 15 minutos de diferencia de tiempo entre tu reloj y el del cliente y estás haciendo un seguimiento de los valores nonce en una tabla de base de datos. La clave única para la tabla va a ser una combinación de ''identificador de cliente'', ''token de acceso'', ''nonce'' y ''marca de tiempo''. Cuando entra una nueva solicitud, verifique que la marca de tiempo esté dentro de los 15 minutos de su reloj y luego busque esa combinación en su tabla. Si se encuentra, rechace la llamada; de lo contrario, agréguelo a su tabla y devuelva el recurso solicitado. Cada vez que agregue un nuevo nonce a la tabla, elimine cualquier registro para esa combinación de ''identificador de cliente'' y ''token de acceso'' con indicación de fecha y hora anterior a 15 minutos.


OK, después de reflexionar lo suficiente, creo que he descifrado este.

Quieren que siempre sepa la marca de tiempo de la última solicitud exitosa que se realizó para que, si aparece una marca de tiempo antes, se ignore.

Además, el Nonce debe ser único, pero solo voy a almacenarlos hasta cierto rango de fechas, por lo tanto, si la marca de tiempo tiene muchas horas, se descartará y se podrá volver a utilizar, sin embargo, debido a que la última marca de tiempo utilizada es también almacenados, no pueden volver a utilizar una solicitud anterior, incluso si el Nonce se considera único porque la marca de tiempo en esa solicitud no está actualizada.

Sin embargo, esto solo funciona debido a la firma. Si modificaron la marca de tiempo o el Nonce en una solicitud, la firma ya no coincidiría con la solicitud y se rechazaría (ya que la marca de tiempo y Nonce son parte de la creación de la firma y no tienen la clave de firma).

¡Uf!


Si OAuth usó solo timstamp, sería relativamente fácil para un atacante adivinar cuál sería la próxima marca de tiempo e inyectar su propia solicitud en el proceso. Simplemente tendrían que hacer "marca de tiempo anterior + 1".

Al usar el nonce, que se genera de una manera criptográficamente segura (con suerte), el atacante no puede simplemente inyectar TS + 1, ya que no tendrá la independencia necesaria para autenticarse.

Piense en ello como una cerradura de puerta segura que requiere una tarjeta de acceso y un código PIN. Puede robar la tarjeta, pero aún no puede pasar por la puerta porque no conoce el pin.