Volver al Centro de conocimiento
Huella digital

Ciclo de semilla de canvas en CreepJS: cuántas rondas siguen distintas

CreepJS multiplica una semilla de canvas por 15000 módulo 2001000001 en cada ronda. Esta sonda mide cuántas rondas siguen distintas antes de que la secuencia se repita.

BotBrowser Team

Documentación

Quieres la documentación estructurada de Huella digital?

Este artículo forma parte de la biblioteca editorial. Para pasos de configuración, material de referencia y actualizaciones continuas, entra en la sección de docs.

BotBrowser puede reproducir un perfil declarado contra un fixture de canvas propio de la página y guardar un registro acotado de lo que la página dibujó; no puede hacer que un dibujo corto represente uno largo, ni cambiar cómo una biblioteca genera su propia semilla. El módulo de canvas de CreepJS construye cada ronda a partir de un estado que se multiplica por una constante y se reduce módulo otra, y cuánto tiempo esa secuencia sigue distinta antes de repetirse decide qué parte de un dibujo largo es nueva. El análisis de métricas emoji de CreepJS separa la geometría textual representativa de esta secuencia de dibujo y de los píxeles de salida.

Resumen

  • CreepJS inicializa su semilla de canvas en 500, multiplica por 15000 y reduce módulo 2001000001, y luego dibuja 10 rondas por defecto.
  • Esos valores publicados producen 8 valores distintos en los primeros 8 sorteos y 10 posiciones enteras distintas a lo largo de las 10 rondas.
  • La secuencia multiplicativa se repite después de exactamente 26940 sorteos, así que el dibujo por defecto de 10 rondas nunca revisita un estado.
  • Cinco rondas de ese dibujo son un prefijo de diez: una página corta y una larga comparten sus primeros cinco valores.
  • Cambiar solo la semilla cambia la secuencia pero no su longitud: las semillas 500, 501, 1000 y 2000 se repiten todas en 26940.
  • Un informe que registra un digest sin número de rondas, semilla y revisión de la fuente no puede decir cuánto del dibujo era nuevo.

Contenido

El primer panel muestra la semilla multiplicada por 15000 y reducida módulo 2001000001 en cada ronda. El segundo muestra los ocho primeros sorteos subiendo sin repetirse y las diez rondas por defecto, todas distintas. El tercero muestra la secuencia volviendo a su inicio después de 26940 sorteos, y el cuarto muestra un dibujo de cinco rondas como prefijo de uno de diez.

El generador publicado

El módulo define un generador pequeño y una asignación de su valor crudo a una coordenada de canvas: El módulo es una huella de canvas, así que su primera tarea es dibujar algo cuya lectura difiera entre máquinas y siga idéntica en una sola. El generador aporta la mitad determinista; el renderizador aporta la otra.

source -> https://raw.githubusercontent.com/abrahamjuliot/creepjs/master/src/canvas/index.ts
source_bytes -> 22274 sha256=6bb5e580122bb26343e1fd8108fb2db6e5a719ab8beebf04394779f06139047d
defaults -> seed=500 offset=2001000001 multiplier=15000
rounds_default -> 10

El generador mantiene un valor actual por debajo del módulo. Cada llamada lo multiplica por 15000 y toma el resto, y la asignación divide por el módulo, escala por la dimensión del canvas y aplica suelo al resultado. Ambos pasos son aritmética entera sin aleatoriedad en el momento del sorteo, y por eso la misma semilla con la misma revisión de la fuente produce las mismas posiciones de ronda.

Eso es un diseño deliberado. Una huella de canvas quiere ser estable para una máquina y una versión de biblioteca dadas, así que no puede sortear píxeles nuevos en cada llamada. Arranca de una semilla y deriva todo lo demás de ella, y la semilla es la parte que aporta la máquina o el perfil. Por eso el informe guarda la revisión de la fuente, no solo una URL: el archivo de master cambia y las constantes pueden cambiar con él.

Cuántas rondas siguen distintas

La longitud del ciclo también separa dos preguntas: cuánto puede crecer una secuencia antes de repetirse y cuántas rondas usa el dibujo por defecto.

Con esos valores por defecto los primeros sorteos son todos distintos: Los ocho valores de abajo son la salida cruda del generador, antes de dividir por el módulo y escalar a un píxel, así que dos informes con distinto tamaño de canvas todavía se pueden comparar en ellos.

first_draws -> 7500000 443999944 671156672 319074969 1733532609 1995122006 1875075045 69660944
first_draws_distinct -> 8 of 8
round_positions -> distinct=10 of 10 rounds

Ocho valores crudos y diez posiciones enteras, sin repeticiones. El dibujo por defecto usa por tanto diez estados distintos, y cada uno cae en una posición distinta del canvas. Nada en la ejecución por defecto se dibuja dos veces desde el mismo estado. Ese número solo cubre diez estados consecutivos del generador, no cuenta los estados que consume una ronda de CreepJS: el módulo llama a getNextSeed() varias veces por ronda, para el gradiente, la sombra y el método de dibujo, así que una ronda avanza más de un estado.

La longitud del ciclo es mucho mayor que la de por defecto:

cycle -> first_repeat_index=0 length=26940
cycle_covers_rounds -> true

26940 sorteos antes de que la secuencia vuelva a su valor inicial. Las 10 rondas por defecto usan 10 de esos 26940 estados, así que el dibujo es un prefijo diminuto de una secuencia mucho más larga. Una página que pidiera 500 rondas seguiría sin repetir estado, y una que pidiera 27000 llegaría al borde del ciclo.

Qué significa un prefijo para la comparación

Un dibujo corto y uno largo con los mismos parámetros no difieren desde el principio; uno contiene al otro: La misma diferencia entre una semilla estable y una superficie renderizada es lo que la huella de canvas registra del lado de la superficie. Una página también puede mantener vivo un dibujo y añadirle contenido; en esa forma los primeros cinco estados del segundo dibujo no son los primeros de la secuencia, así que la propiedad del prefijo solo vale cuando la página vuelve a sembrar.

Un registro sin capa de renderizador no puede separar una secuencia distinta de una pintura distinta, así que las dos mitades se guardan juntas. El registro mínimo incluye seed, rounds, el digest de la fuente y el tamaño del canvas, y anota además qué renderizador respondió.

La revisión de la fuente y el tamaño del canvas se guardan junto al digest, porque un digest solo no separa la secuencia del renderizado.

Una comparación entre máquinas sigue este orden: revisión de la fuente, semilla, número de rondas, tamaño del canvas, renderizador y solo después el digest.

El mapeo aplica suelo en lugar de redondear: un estado que cae en 37.9 aterriza en el píxel 37 y uno que cae en 38.1 aterriza en el 38, así que dos estados cercanos pueden compartir coordenada o separarse según el tamaño.

El límite de escala merece su propia lectura: con un canvas de 50 píxeles solo hay 50 posiciones enteras por eje, así que dos estados distintos pueden redondear a la misma coordenada; con un canvas mayor esas colisiones son más raras.

Un digest de canvas.toDataURL() oculta si se añadió la décima ronda: las primeras rondas de seed=500 coinciden en ambos casos.

El informe trata de la petición, así que sus campos reflejan la petición y no la imagen: una imagen puede verse igual tras cambiar el renderizador y una petición puede verse igual tras cambiar la escala, y solo un registro que separa ambos campos puede distinguirlos.

prefix -> five_rounds_are_prefix_of_ten=true

Eso tiene una consecuencia práctica para cualquier comparación que guarde un único digest. Dos páginas con la misma semilla y distinto número de rondas producen digests distintos, porque la décima ronda cambia los píxeles. Lee esa diferencia como un cambio en la longitud del dibujo y no en el navegador. Una revisión que trate todo digest distinto como diferencia de dispositivo atribuirá un parámetro de página al entorno.

La misma asimetría aparece cuando una página añade una ronda. Los cinco primeros estados no se tocan, así que una comparación a nivel de píxel sobre el área compartida no encuentra diferencia mientras el digest de la imagen completa cambia. Un informe que guarde solo el digest completo no puede decir qué ronda se añadió.

Esa estructura explica por qué dos informes de CreepJS de páginas distintas pueden diferir describiendo la misma máquina. El estado del generador es determinista, así que las únicas variables que se mueven son la semilla, el número de rondas y la revisión de la fuente. Dos páginas que comparten las tres producen posiciones idénticas, y dos que comparten solo la semilla divergen desde la primera ronda extra. Una comparación que no conoce el número de rondas no tiene forma de decidir en cuál de esos casos está. Un perfil que reproduce el mismo dibujo entre visitas es la pregunta de la reproducibilidad de la semilla de ruido, con el generador de canvas como estado que se mantiene. El multiplicador 15000 y el módulo 2001000001 son los dos números que conviene conservar, porque cualquier cambio en ellos describe una fuente distinta y no una máquina distinta.

Dónde el recuento deja de informar

Una cifra abordable sale del módulo y del multiplicador, no de la semilla: El valor multiplier=15000 y el módulo offset=2001000001 la fijan, así que un informe puede citar ambos y comprobar gcd antes de comparar dos ejecuciones.

seed:500 -> cycle=26940 draws_8_distinct=1
seed:501 -> cycle=26940 draws_8_distinct=1
seed:1000 -> cycle=26940 draws_8_distinct=1
seed:2000 -> cycle=26940 draws_8_distinct=1

Todas las semillas probadas se repiten en 26940 sorteos, porque el módulo y el multiplicador fijan la longitud del ciclo para cualquier punto de partida coprimo con el módulo. La semilla elige dónde empieza el dibujo dentro de la secuencia; no cambia cuánto dura la secuencia.

La segunda columna de esa salida engaña a propósito, y muestra una trampa de medición. La sonda recreó el generador dentro de una sola expresión en cada uno de los ocho sorteos, así que cada llamada volvió a arrancar desde la semilla y devolvió el mismo primer valor. Una sonda escrita así informa un valor distinto y concluye que el generador es degenerado. La lectura correcta es la medida antes: ocho valores distintos de una sola instancia. Un informe escrito solo con el digest puede confundir una página que reinicia el generador con una que lo continúa.

La misma comprobación cubre el número de rondas: un informe de cinco rondas y otro de diez comparten fuente y semilla, así que sus primeros cinco valores coinciden y solo cambia el digest.Esa trampa merece decirse porque es la forma más común en que una sonda de semillas produce un falso positivo. Crear el generador dentro del bucle, o reiniciarlo entre sorteos, mide el primer valor repetidamente y nunca toca la secuencia. El detalle del multiplier=15000 y del offset=2001000001 se conserva junto a la semilla, porque sin ellos la secuencia no se puede recalcular sin conexión.

Una página que dibuja más de 26940 rondas vería un estado repetido, y una que dibuja miles seguiría cómodamente dentro del ciclo; el dibujo por defecto de rounds=10 está muy lejos de ese límite.

El límite real es otro. Una página que dibuje más de 26940 rondas vería un estado repetido, y una que dibuje miles seguiría dentro del ciclo. Las 10 rondas por defecto están lejos de ese límite, así que la longitud del ciclo dice al revisor cuánto puede crecer un dibujo antes de dar la vuelta, no lo que hace el dibujo por defecto.

Registrar una lectura de canvas

Una lectura de canvas sostiene una afirmación estrecha: esta revisión de la fuente, esta semilla y este número de rondas produjeron estas posiciones distintas. Cuatro campos la mantienen comprobable:

  1. La revisión y el digest de la fuente, porque un cambio en el multiplicador o el módulo cambia cada sorteo.
  2. La semilla y el número de rondas, porque deciden qué parte de la secuencia usa un dibujo.
  3. Los recuentos de estados y posiciones distintas, porque un digest solo no puede decir si se añadió una ronda o se movió la semilla.
  4. El ciclo de vida del generador, porque recrearlo en cada sorteo convierte la secuencia en un primer valor repetido.

El artículo de tablas de fuentes lee un tercer conjunto de tablas públicas de la misma forma, y sus recuentos y grupos acompañan al ciclo de semilla de canvas.

Fuentes públicas

Conclusión práctica

Registra la semilla, el número de rondas y la revisión de la fuente con cada comparación de canvas, porque un digest solo no distingue un dibujo más largo de uno distinto. Trata cinco rondas como un prefijo de diez cuando la semilla y la revisión coinciden, y espera que el digest difiera igualmente. Lee el ciclo de 26940 sorteos como la distancia que un dibujo puede crecer antes de repetirse, no como una propiedad de las diez rondas por defecto. Para la aritmética detrás de una comparación de canvas más larga, lee cómo agrupa CreepJS sus señales de canvas; para dónde termina una lectura del lado de la página y empieza una del lado de la conexión, lee las reglas de capa de red que una página no puede evaluar.

#CreepJS#Huella De Canvas#Semillas Pseudoaleatorias#Análisis De Señales#Privacidad

Este artículo forma parte de la guía: ¿Qué es la huella digital del navegador?

Lleva BotBrowser de la investigación a producción

Usa estas guías para entender el modelo y después avanzar hacia validación multiplataforma, contextos aislados y despliegue de navegador preparado para escalar.