Детерминированный режим: воспроизводимые отпечатки
Как фиксированный сид шума делает шум Canvas, WebGL, Audio и метрик текста воспроизводимым между сеансами и как проверить, что один сид повторяет результат, а другой меняет его.
BotBrowser Team
Нужна структурированная документация по теме Отпечатки?
Эта статья относится к редакционной библиотеке. Для пошаговой настройки, справки и постоянных обновлений переходите сразу в соответствующий раздел docs.
BotBrowser может повторять видимый браузером шум с сидом в контролируемом контексте, но не делает одинаковыми разные сборки, профили, машины или решения сайтов; эта статья задаёт границу воспроизводимости.
TL;DR
Используйте положительный --bot-noise-seed с тем же профилем и сборкой, когда контролируемый запуск должен повторять Canvas, WebGL, Audio и метрики текста; смена сида должна быть намеренной.
Contents
Содержание
- Зачем нужен воспроизводимый шум
- Что контролирует сид и чего он не касается
- Как выбирать сиды для стабильных идентичностей
- Запуск с фиксированным сидом
- Проверка воспроизводимости
- Ограничения, которые нужно учитывать
- Практический итог
Зачем нужен воспроизводимый шум
У шума отпечатка две задачи, которые тянут в разные стороны. Небольшие вариации в Canvas, WebGL, Audio и текстовых измерениях не дают браузеру выдавать необработанный вывод одной машины. Тесту или долгому рабочему процессу нужно обратное: тот же результат при повторном запуске завтра. Если каждый запуск создаёт новый шум, вы не можете понять, откуда взялся изменившийся результат: из вашей конфигурации, из тестируемой страницы или из самого шума. BotBrowser может повторять одну и ту же конфигурацию с зерном в контролируемом контексте, чтобы запуски оставались сопоставимыми, но не делает результаты одинаковыми для разных сборок, платформ и оборудования.
Сид шума снимает это противоречие. Это одно целое число, которым инициализируется генератор псевдослучайных чисел, поэтому последовательность значений шума полностью определяется сидом. Два запуска с одним сидом применяют одну и ту же вариацию к одному и тому же рисунку или измерению, а другой сид даёт другую вариацию. Вы сами решаете, когда результат должен повторяться, а когда меняться.
Специалисты по приватности и тестировщики обычно используют фиксированный сид в четырёх случаях:
- Непрерывность сеанса. Возвращение на сервис через несколько запусков с одним и тем же выводом Canvas, WebGL, Audio и метрик текста.
- Различные стабильные идентичности. Отдельным аккаунтам или тестовым пользователям выдаётся свой узор шума, который не меняется между запусками.
- Проверка конфигурации. Подтверждение того, что профиль и набор флагов дают ожидаемый результат, а смена сида даёт другой.
- Воспроизводимые эксперименты. Исключение шума отпечатка из числа переменных при сравнении двух сборок, двух страниц или двух профилей.
Дальнейшие разделы ведут от поверхностей, которых касается сид, через выбор значений и аргументы запуска к процедуре проверки и ограничениям, которые стоит учитывать. Основой служит публичная документация по воспроизводимости сида шума, а поведение Canvas описано в справочнике MDN по Canvas API, указанном в источниках.
Что контролирует сид и чего он не касается
Флаг --bot-noise-seed действует на поверхности, где BotBrowser добавляет шум:
- Canvas 2D. Фигуры, текст и чтение пикселей через
toDataURL(),toBlob()иgetImageData(). - WebGL и WebGPU. Отрисованный результат, который страница считывает с поверхности рисования.
- Audio. Значения отсчётов, получаемые при обработке звука, например при рендеринге через OfflineAudioContext.
- Метрики текста. Измерения, которые возвращают
measureText(),getBoundingClientRect()иgetClientRects().
Сид повторяет шум для одного и того же содержимого. Отделяйте наблюдения случайных значений по инструкции Наблюдаемость криптографической случайности и отпечатки браузера. Страница, которая рисует одну и ту же сцену с сидом 42 в двух сеансах, считывает одни и те же пиксели. Та же сцена с сидом 43 даёт другие пиксели, столь же стабильные. Поэтому проверочная страница должна рисовать фиксированную сцену: если содержимое меняется между запусками, результат меняется по причинам, не связанным с сидом.
Сид не затрагивает значения, которые берутся из профиля. Свойства navigator, размеры экрана и строка user agent читаются из профиля и остаются одинаковыми при каждом запуске независимо от сида. Хранилище, cookie и состояние сеанса тоже относятся к другой области. Они находятся в каталоге, заданном через --user-data-dir, и в значениях, загруженных через --bot-cookies, поэтому сид не восстанавливает вход в аккаунт и не помнит прошлый визит.
У каждого канала шума есть и собственный переключатель в справочнике командной строки: --bot-noise-canvas, --bot-noise-webgl-image, --bot-noise-audio-context, --bot-noise-client-rects и --bot-noise-text-rects. Они принимают true или false. Сид определяет, каким будет шум, а переключатели определяют, какие поверхности получают шум вообще, так что эти два средства отвечают на разные вопросы.
У самого значения два правила. Допустимый диапазон от 1 до 4294967295, это наибольшее 32-битное целое без знака. Значение 0 ведёт себя иначе: оно сохраняет шум включённым со значениями профиля по умолчанию, но без детерминированного сида, поэтому результат не должен повторяться между сеансами. Если вам нужна повторяемость, выберите положительное целое число и передавайте его при каждом запуске.
Время управляется отдельно. --bot-time-seed принимает целое число от 1 до 4294967295 для воспроизводимой политики времени выполнения, а 0 её отключает. --bot-time-scale принимает дробное число меньше 1.0 для масштабирования этой политики. --bot-stack-seed принимает profile, real или положительное целое число для поведения глубины стека. Это независимые средства управления: один сид шума не делает повторяемым время, а сид времени не меняет вывод Canvas. Если тесту нужно, чтобы повторялись и шум отрисовки, и время, задайте оба значения осознанно и запишите оба. О том, как performance.now, hardwareConcurrency и deviceMemory складываются в сигнал времени и как проверить сообщаемое время, см. Отпечаток браузера: сигналы времени, процессора и памяти.
Как выбирать сиды для стабильных идентичностей
Удобно думать об этой паре так: профиль определяет класс устройства, а сид определяет узор шума внутри этого класса. Профиль A с сидом 100 даёт один стабильный воспроизводимый отпечаток. Профиль A с сидом 200 использует те же значения профиля, но с другим узором шума. Профиль B с сидом 100 имеет другую основу и потому другой результат, хотя значение сида то же. Сид никогда не заставляет два разных профиля давать один и тот же отпечаток, потому что базовые значения всё равно различаются.
Небольшой план для трёх сеансов мог бы выглядеть так:
- Сеанс первый: профиль A с сидом 100 для первого аккаунта или тестового пользователя.
- Сеанс второй: профиль A с сидом 200 для второго аккаунта, который должен сохранять собственный узор шума.
- Сеанс третий: профиль B с сидом 100 для другого класса устройства, который повторно использует значение сида.
Несколько привычек делают этот план надёжным со временем. Создайте каждый сид один раз и храните его рядом с аккаунтом или тестовым случаем, которому он принадлежит, потому что позже сид нельзя восстановить по результату. Не выводите сид из того, что меняется, например из временной метки или счётчика, который сбрасывается: так детерминированная настройка незаметно превращается в другое значение при каждом запуске. Не используйте один сид для сеансов, у которых должны быть раздельные узоры шума. И храните назначение сидов там же, где имя файла профиля, чтобы позже можно было восстановить точную пару. О том, как назначать зёрна идентичностям без создания связей и как повторять запуски в CI, см. Воспроизводимость шумового зерна для повторяемых запусков.
Когда одному процессу браузера нужно несколько идентичностей, поконтекстные отпечатки (ENT Tier3) позволяют каждому BrowserContext иметь собственный --bot-noise-seed. В документации флаги задаются для контекста до создания его первой страницы, чтобы отрисовщик запускался с правильными значениями. Второй контекст с другим сидом тогда даёт другой, но столь же воспроизводимый узор.
Сиды являются обычными значениями конфигурации. Они не обязаны идти по порядку, подойдёт любое положительное целое число из допустимого диапазона. Это и не учётные данные: любой, у кого есть та же сборка, тот же профиль и тот же сид, может воспроизвести тот же узор шума, и в этом смысл воспроизводимой настройки. Относитесь к ним как к остальной тестовой конфигурации, версионируйте вместе с ней и держите подальше от мест, где вероятно случайное повторное использование.
Помните о границах сида. Разные сиды дают разные узоры шума поверх одних и тех же значений профиля, а это не то же самое, что несвязанные браузеры. Cookie, хранилище, сетевой маршрут и поведение человека или скрипта, работающего с браузером, являются отдельными сигналами, и сид ничем из этого не управляет.
Запуск с фиксированным сидом
Самый простой детерминированный запуск передаёт профиль и сид. Новый каталог пользовательских данных не пускает в сравнение старое состояние браузера:
chromium-browser \
--bot-profile="path/to/profile.enc" \
--bot-noise-seed=42 \
--user-data-dir="$(mktemp -d)"
Когда должно повторяться и время, добавьте независимые средства управления временем и глубиной стека с их собственными значениями:
chromium-browser \
--bot-profile="path/to/profile.enc" \
--bot-noise-seed=42 \
--bot-time-seed=42 \
--bot-stack-seed=profile
Два одновременных сеанса, у которых должны быть разные идентичности, используют разные сиды и отдельные каталоги пользовательских данных. Сид и каталог управляют разным: первый задаёт узор шума, второй хранит cookie и данные хранилища.
chromium-browser --bot-profile="path/to/profile.enc" --bot-noise-seed=1001 --user-data-dir="tmp/session-a" &
chromium-browser --bot-profile="path/to/profile.enc" --bot-noise-seed=1002 --user-data-dir="tmp/session-b" &
Фреймворки автоматизации передают те же флаги как аргументы запуска рядом с путём к исполняемому файлу сборки BotBrowser. Задавайте их в аргументах запуска, а не после того, как страница уже открыта. Сид не меняет того, как фреймворк управляет страницей.
Иногда детерминированный результат нужен для одних поверхностей, а собственная отрисовка хоста для других. Переключатели отдельных поверхностей принимают true или false, и отключённая вами поверхность больше не подчиняется сиду:
chromium-browser \
--bot-profile="path/to/profile.enc" \
--bot-noise-seed=42 \
--bot-noise-canvas=false \
--bot-noise-audio-context=false
Считайте эту последнюю форму диагностическим шагом. Если результат теста перестал повторяться, поочерёдное отключение каналов покажет, какая поверхность тому причиной. Включите каналы обратно, прежде чем полагаться на настройку, и сохраните итоговую команду запуска в заметках, чтобы использовать те же аргументы снова. Цель в том, чтобы получить одну командную строку, которую можно вставить во второй сеанс и ожидать того же поведения.
Проверка воспроизводимости
Проверка имеет смысл только тогда, когда тестируемая страница стабильна. Используйте страницу, которую вы контролируете, или страницу проверки отпечатка, про которую известно, что она каждый раз рисует одну и ту же сцену. Она должна рисовать фиксированную сцену Canvas, считывать фиксированную сцену WebGL, рендерить фиксированный автономный аудиобуфер и измерять фиксированную строку. Записывайте значения, которые она сообщает, или краткую сводку по каждому, чтобы сравнения были точными. Запускайте страницу одинаково каждый раз, с одним и тем же размером окна и порядком загрузки, чтобы единственным намеренным отличием между запусками был сид. О том, как различия AudioContext и OfflineAudioContext образуют аудио-отпечаток и как проверить согласованность звука, см. Аудио-отпечатки: как AudioContext отслеживает вас.
- Запустите с профилем и
--bot-noise-seed=42, загрузите страницу и запишите значения Canvas, WebGL, Audio и метрик текста. - Закройте браузер, запустите снова с тем же профилем и сидом и загрузите ту же страницу. Все записанные значения должны совпасть с первым запуском.
- Смените сид на
--bot-noise-seed=43и запустите страницу в третий раз. Значения должны отличаться от первого запуска, что подтверждает: именно сид формирует результат. - Запустите дважды с
--bot-noise-seed=0. Результат между этими сеансами должен меняться, потому что 0 сохраняет шум включённым без детерминированного сида. - Сохраните рядом с результатами сборку BotBrowser, файл профиля, операционную систему хоста и полный список аргументов.
Последний шаг чаще всего пропускают, и именно он позволяет легко объяснить позднее расхождение. Результат сопоставим с другим результатом только при одинаковых сборке, профиле, сиде и аргументах запуска.
Если второй сеанс не совпал с первым, сначала проверьте простые объяснения, а не подозревайте сид. Убедитесь, что путь и версия профиля те же, что никакой фреймворк не добавляет лишних аргументов и что страница каждый раз рисует одно и то же содержимое. Сравните сборку BotBrowser, целевую операционную систему хоста и полный список аргументов. Документация также рекомендует сохранять неизменными прокси, локаль и часовой пояс, а также нагрузку на машину, пока вы сравниваете запуски, потому что они могут менять поведение страницы, даже когда сид не изменился.
Повторяйте процедуру всякий раз, когда меняется один из входов: обновление BotBrowser, замена файла профиля, переход на другую машину или правка аргументов запуска. Короткая повторная проверка после каждого изменения дешевле, чем обнаружение дрейфа посреди долгого теста, и она сужает причину любого отличия, потому что сдвинулся только один вход.
Запись, по которой можно восстановить сеанс, требует лишь нескольких полей для каждого сида:
- Значение сида и аккаунт или тестовый случай, которому он принадлежит.
- Имя файла профиля и его версия.
- Использованная сборка BotBrowser.
- Целевая операционная система хоста и тип машины.
- Полный список аргументов запуска, включая любой сид времени или стека.
- Значения, которые сообщила проверочная страница, с датой запуска.
С такой записью обновление превращается в сравнение, а не в сюрприз. Запустите проверочную страницу на новой сборке с сохранённым сидом и сравните результат с сохранёнными значениями. Если они совпали, продолжайте. Если различаются, считайте новые значения новой точкой отсчёта, запишите сборку, которая их дала, и не меняйте сид, пытаясь вернуть прежний результат, потому что менялся не сид.
Иногда новый узор шума как раз то, что вам нужно, например когда вы выводите из использования одну тестовую идентичность и начинаете другую. Меняйте сид намеренно, обновляйте запись в том же шаге и сохраняйте старую строку с номером сборки. Старый сид остаётся верным описанием того, что эта сборка выдавала для этого профиля.
Такая проверка отвечает на узкий вопрос: повторяет ли эта сборка с этим профилем и этим сидом свой шум? Она не говорит, как на отпечаток отреагирует конкретный сайт. Держите эти два вопроса раздельно в своих заметках.
Ограничения, которые нужно учитывать
Воспроизводимость относится к той же сборке BotBrowser, тому же профилю и тому же значению --bot-noise-seed. Алгоритм шума может меняться между основными версиями, поэтому сид, который совпадал на одной основной версии, после обновления нужно проверить заново. Другая машина, другая целевая операционная система хоста или другие аргументы запуска тоже могут изменить результаты. Совпадение между машинами или версиями следует подтверждать описанной выше процедурой, а не считать данным.
Стабильный отпечаток тоже является компромиссом. Одинаковый вывод при каждом визите обеспечивает непрерывность сеанса, и это же свойство позволяет распознавать повторные визиты как повторные. Если вы хотите, чтобы разные сеансы несли несвязанные узоры шума, задайте им разные сиды и помните, что узор шума лишь один из сигналов, которые видит сервис. Сид не делает отпечаток несвязываемым, и ничто здесь не утверждает, как отреагирует какой-либо сайт.
Полезно также точно понимать, что позволяет утверждать успешная проверка. Она позволяет сказать, что данные сборка, профиль и сид повторили один и тот же вывод Canvas, WebGL, Audio и метрик текста на данной машине, а другой сид его изменил. Она не позволяет сказать, что тот же результат сохранится на всех машинах, после каждого обновления или на любой странице. Записывайте результаты в первой форме, и запись останется точной, когда кто-то прочтёт её через несколько месяцев.
Сид 0 заслуживает последнего упоминания, потому что его легко выбрать случайно. Он сохраняет шум включённым со значениями профиля по умолчанию, что полезно, когда нужна вариативность, но это не детерминированная настройка. Если проверка показывает, что результат меняется между запусками, сначала убедитесь, что сид в командной строке положительное целое число и что ваш загрузчик или фреймворк его передаёт.
BotBrowser поддерживает --bot-noise-seed (ENT Tier2), целое число от 1 до 4294967295, которое задаёт начальное состояние шума Canvas, WebGL, Audio и метрик текста, поэтому один и тот же профиль и сид повторяют один и тот же отпечаток в тесте непрерывности сеанса или проверки, а другой сид даёт отдельную стабильную идентичность. BotBrowser не может гарантировать одинаковый результат при разных сборках, профилях или изменённых аргументах запуска, не может сделать отпечаток несвязываемым или принимаемым сайтом и не заменяет управление хранилищем и cookie, выбор прокси и IP-адреса или собственные проверки сайта.
Для общего контекста по затронутым поверхностям см. Что такое отпечаток браузера, Отпечаток Canvas, Защита аудиоотпечатка и более краткий обзор воспроизводимости сида шума.
Источники
- Документация BotBrowser по воспроизводимости сида шума
- Справочник флагов командной строки BotBrowser
- Справочник MDN по Canvas API
- Справочник MDN по OfflineAudioContext
Практический итог
Храните профиль, положительный сид, сборку и все аргументы в каждой записи. Повторяйте фиксированную фикстуру после изменения сборки, профиля, машины или аргументов и описывайте результат только для заявленного контекста.
Эта статья входит в руководство: Что такое отпечаток браузера?
Похожие статьи
Воспроизводимость шумового зерна для повторяемых запусков
ОтпечаткиАудио-отпечатки: как AudioContext отслеживает вас
ОтпечаткиОтпечаток Canvas: как он работает и что помогает
ОтпечаткиСнятие отпечатков WebGPU: следующее поколение отслеживания GPU
Отпечаткиwebgl_debug_renderer_info: что GPU раскрывает страницам
Отпечаткиperformance.now: разрешение таймера и отпечаток браузера
Переведите BotBrowser из исследований в продакшн
Используйте эти руководства, чтобы понять модель, а затем перейти к кроссплатформенной валидации, изолированным контекстам и масштабируемому браузерному развертыванию.