Зачем мне эта тема сейчас

Первые годы вокруг меня почти все говорили «отпечаток». Один дайджест — и будто личность поймана. На слайде это выглядит победно. В лаборатории дайджест слишком часто предаёт и детектор, и исследователя.

Окно изменило размер — сумма полей другая. Обновился браузер — другая. Человек иначе разрешил доступ к данным — другая. При этом история согласованности могла остаться честной: заявление «я такой-то браузер на таком-то классе устройства» по-прежнему сходилось с тем, что умеет поверхность. Или наоборот: дайджест ещё «красивый», а слои внутри уже спорят друг с другом.

Я переучиваю язык. Не «поймай отпечаток». А «найди противоречие слоёв». Это скромнее на слух и честнее инженерно.

Третий текст серии нужен как словарь. Без него два зеркала и дневник всё равно скатываются к удобной магии одной строки.

Откуда взялся культ одного хеша

Откуда взялся культ одного хеша
Процесс: хеш vs согласованность

Хеш обещает три вещи, которые все любят.

Он обещает сжатие: много сигналов → одна строка. Он обещает сравнение: равны / не равны. Он обещает масштаб: можно класть в базу и искать «тех же».

В учебных демо и в маркетинге отпечатков это звучит как судьба. В жизни браузера слишком много законных причин, почему строка поедет: обновление, шрифты, размер окна, privacy-режим, политика Client Hints, другая сеть, другой набор разрешений.

Культ хеша опасен не тем, что хеши бесполезны. Они полезны как инструмент эксперимента и как один из признаков. Он опасен тем, что подменяет вопрос. Вместо «согласованы ли слои?» звучит «совпала ли строка?».

Общедоступная рамка

Общедоступная рамка
Акценты: слои профиля

В публичных текстах detect.expert мне близка критика единого SHA по большому набору полей: такое удобно хранить и сравнивать, но хрупко к бытовым изменениям. Полезнее смотреть согласованность заявленного профиля с измеренным поведением и ветвями поверхности — ансамбль слабых сигналов вместо одной «магической» строки. Мне не нужно Liturgy их точности; мне нужен принцип.

Открытые consistency-инструменты вроде x-bot version1 говорят на похожем языке: нестыковка версии API и UA, нестыковка движка и заявления, расхождение контекстов. Там риск — про противоречия. Не про «мы вычислили душу».

Даже Client Hints в документации Chrome полезно читать как урок скромности: подсказки бывают урезаны, ограничены политикой, не обязаны быть полным доказательством. Заявление браузера — гипотеза. Гипотезу проверяют.

Календарь фич в Chrome release notes, Firefox Releases и WebKit blog показывает другую полезную мысль: поверхность API имеет историю. История позволяет говорить о «этаже возможностей» без сведения всего человека к одному дайджесту. Подробнее об этом будут отдельные тексты серии; здесь достаточно принципа.

Четыре слоя, о которых я говорю вслух

Чтобы не утонуть в абстракции, я держу простую карту.

1. Заявление. То, что браузер (или его обвязка) говорит о себе: UA, hints, иногда явные поля профиля. 2. Поверхность возможностей. То, что реально доступно в JS/CSS/Web API на этой версии и в этом контексте. 3. Поведение во времени. Как устройством пользуются: сенсоры, жест, ритм. Общими словами, без биометрических порогов в публичном тексте. 4. Сеть как контекст. Откуда пришёл трафик, как выглядит транспортный слой, что говорит WebRTC-кандидатный зоопарк. Контекст — не автоматически «бот».

Согласованность — про то, не рассказывают ли эти слои разные сказки. Хеш часто смешивает слои в кашу и потом удивляется, что каша солёная.

Что я наблюдаю в лабе общими словами

Ложная тревога

Когда я склеиваю слишком много в один дайджест, получаю ложную тревогу на живом человеке. Быт шумный. Сеть шумит. Приватность режет подсказки. Локаль, шрифты, размер окна, обновление минорной версии — всё это двигает хеш. Человек тот же, ярлык уже другой. Детектор, влюблённый в дайджест, начинает ненавидеть жизнь.

Ложный покой

Иногда наоборот: дайджест стабилен, а внутри конфликт. Заявление ОС и поверхность возможностей спорят. Заявление версии и этаж API спорят. Один контекст исполнения и другой рассказывают разное. Статический вид «ровный», поведение во времени странное. Стабильность без согласованности — декорация.

Язык команды

Если в лабе говорят «сработал отпечаток», все думают про ярлык. Если говорят «нашли противоречие A vs B», все думают про проверку гипотезы. Второй разговор продуктивнее. Он требует назвать слои. Названные слои труднее спрятать под магией.

Публичный чекер снова здесь

Зелёный чекер может означать «алфавит поверхности в порядке». Он не означает «история согласованности закрыта». Красный чекер может означать бытовой шум. Он не означает «автоматизация доказана». Дневниковый жанр из предыдущего текста как раз учит не делать из цвета экрана мировоззрение.

Мини-сценарии (учебные, без рецептов)

Сценарий A. Человек открыл приватное окно. Часть storage-истории исчезла, часть подсказок урезана. Хеш «другой». Согласованность заявления «я обычный Chrome» с поверхностью API может остаться нормальной. Если я орý на хеш, я воюю с privacy.

Сценарий B. Профиль заявляет одну эпоху браузера, а набор доступных API выглядит как другая эпоха. Это уже язык противоречия заявления и поверхности. Его можно обсуждать через release notes и открытые feature-detector’ы — без превращения текста в гайд подмены.

Сценарий C. В одном контексте одно, в изолированном — другое. Публичные инструменты давно намекают сравнивать «комнаты» браузера. Здесь важен принцип: одна правда должна звучать похоже в разных комнатах. Детали реализации я оставляю за кадром.

Эти сценарии не для копирования атаки. Они для тренировки вопроса: какой слой с каким не сошёлся?

Что это меняет в детекте и в билде

В детекте я формулирую вывод осторожнее. «Есть противоречие между заявлением и измерением» — рабочая фраза. «Это бот» — редкая фраза без контекста, истории и понимания цены ошибки. Я хочу, чтобы мягкий бытовой шум не автоматически становился приговором — об этом будет отдельный текст серии. Здесь достаточно принципа: не всё, что изменилось в хеше, является автоматизацией; не всё, что стабильно в хеше, является согласованным.

В билде я перестаю праздновать «стабильный fingerprint» как главную метрику. Стабильность полезна для эксперимента (меньше случайного шума между прогонами). Но цель исследования — согласованная история слоёв, а не красивая константа в логе. Если комнаты браузера рассказывают разные сказки, стабильный дайджест меня не утешает.

Связка с двумя зеркалами здесь прямая. Детект, влюблённый в хеш, требует от билда «совпади с эталоном строки». Детект, влюблённый в согласованность, требует от билда «не ври между слоями». Вторая цель труднее и честнее.

Связка с дневником тоже прямая. Военный жанр любит хеш: он даёт счёт. Лабораторный жанр любит противоречие: оно даёт вопрос.

Как я веду заметки, чтобы не вернуться к культу хеша

В журнале эксперимента я стараюсь писать четыре поля даже тогда, когда очень хочется одну строку:

  • Какое *заявление* проверяю.
  • Какое *измерение* поверхности/поведения/сети рядом.
  • В чём *противоречие* (или почему его нет).
  • Это похоже на *быт* или на *ломать целостность среды*?

Если я не могу заполнить третье поле, у меня ещё нет вывода — есть только беспокойство. Беспокойство — топливо исследования, не вердикт.

Чего я не скажу и почему

Я не публикую формулы скоринга, веса, пороги и каталоги внутренних сигналов. Идея слоёв и критика единого хеша — публичная грамотность. Рецепт конкретного продакшена — нет.

Я также не превращаю этот текст в инструкцию «как стабилизировать отпечаток». Стабилизация ради обхода — другой жанр, и он запрещён уставом серии.

Я не даю «универсальный набор полей для идеального хеша». Универсальность здесь — часть проблемы.

Короткий вывод

Один большой хеш удобен на слайде и хрупок в жизни. Я учу себя языку согласованности: заявление браузера, поверхность API, поведение, сеть как контекст. Противоречие — честнее ярлыка. Вместе с двумя зеркалами и жанром дневника это третий столп серии.

Дальше можно спускаться в частности — начиная с самого привычного заявления: User-Agent. Не чтобы научиться его подделывать, а чтобы раз и навсегда перестать путать заявление с доказательством.

Короткий вывод
Заметки: анти-хеш