Возможность
Отпечаток и его редактор
- 4
- Поколение генератора
- 5
- Шаблонов
- 29 на столе, 34 на телефоне
- Строк самопроверки
- 114
- Стран с часами и языком
Отпечаток это целая машина, расписанная по полям
Сайт читает не одну строку. Он читает экран, видеокарту, число ядер, память, установленные шрифты, часы, набор языков, сколько микрофонов и камер откликнулось, что сообщает связь и до какого предела растёт куча страницы. Каждый ответ по отдельности обычен. Вместе они называют компьютер.
Поэтому ARMANOS не правит подпись браузера. Он собирает отпечаток из 34 полей, одно из которых само держит 11 подсказок клиента, и отдаёт странице эту машину целиком. У каждого профиля свой набор.
Ничего из этого не хранится. Отпечаток выводится заново из шаблона и номера профиля при каждом запуске. Поэтому один и тот же профиль остаётся одной и той же машиной на ноутбуке, на настольном компьютере и на машине напарника после сверки.
- navigator.platform
- MacIntel
- Подпись браузера
- Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/153.0.0.0 Safari/537.36
- Платформа подсказок
- macOS 15.1.0
- Архитектура, разрядность
- arm, 64
- uaFullVersion
- 153.0.7978.0
- Экран, доступная область
- 1470x956, 1470x931
- devicePixelRatio
- 2
- Производитель WebGL
- Google Inc. (Apple)
- Рендерер WebGL
- ANGLE (Apple, ANGLE Metal Renderer: Apple M1 Pro, Unspecified Version)
- Ядра, память
- 8, 8 ГБ
- Часовой пояс
- Europe/Rome
- Языки
- it-IT, it, en
- Шрифты
- 85 имён, начиная с Helvetica Neue, Helvetica, Arial
- maxTouchPoints
- 0
- Микрофоны, выходы, камеры
- 1, 1, 1
- Голоса синтеза
- только it
- Связь
- 10 Мбит/с, 50 мс, 4g
- Старшее поколение кучи
- 4096 МБ
- Семена холста и звука
- 1884544265, 3829808191
- Правило WebRTC
- disable-non-proxied-udp
Настоящий жребий: шаблон macOS / Chrome, номер профиля acct-42, поколение 4, движок 153.0.7978.0, прокси не привязан. Повторите на любой машине и получите ровно это.
Опознание
платформа, подпись браузера, производитель и блок подсказок клиента: марки, полный список версий, версия системы, архитектура, разрядность, модель, признак мобильного, форма аппарата.
Экран
ширина и высота, доступная область за вычетом полосы меню, глубина цвета, коэффициент плотности точек.
Железо
производитель и рендерер WebGL, число ядер, объём памяти, число касаний, список шрифтов.
Место
часовой пояс, набор языков, основная локаль и страна, когда оба поля пришли из одного жребия.
Поля второй заплаты
входы и выходы звука, камеры, язык голосов синтеза речи, скорость канала, задержка, вид связи и предел старшего поколения кучи.
Семена шума
постоянное семя холста и постоянное семя звука, выведенные из номера профиля, плюс правило WebRTC.
Всё решает одно семя, и потому противоречий не возникает
Каждое значение берётся хешем от номера профиля вместе с меткой поля. Случайности при запуске нет, и нет второго жребия, который мог бы разойтись с первым.
Это важно, потому что сильнее всего выдают не странные значения, а пары. Рендерер Apple M1 рядом с архитектурой x86 это машина, которой никогда не выпускали, и прочесть оба поля можно одним обращением. Поэтому жребии связаны в цепочку: сперва выбирается видеокарта, а остальное железо следует за ней.
Числа, которые настоящий браузер огрубляет, огрубляются и здесь. Память режется восемью гигабайтами, потому что Chrome режет её при любом объёме. Задержка кратна 50 мс. Скорость режется потолком 10 Мбит/с. Вид связи не тянется отдельно, а считается из задержки по порогам самого Chromium: 2010, 1420 и 272 мс.
- 1
Выбрать видеокарту
Одна пара производителя и рендерера из набора шаблона. У macOS их 10, у Windows 7, у Linux 7, поэтому профили перестают делить одну карту.
- 2
Снять с неё ядра и память
У каждого класса карт свои числа, те самые, с какими эта карта выходит. У Apple M4 десять ядер, у M1 восемь, а встроенному видео Kaby Lake шестнадцать не достанется никогда.
- 3
Снять с неё же архитектуру
Рендерер Apple Silicon требует arm, всё остальное x86. Обе семьи карт лежат в одном списке, так что до невозможной машины тут одно нажатие.
- 4
Сузить версии системы
M4 начинается с macOS 15.1, M3 с 14.1, M2 с 13.0, а карта Iris Plus 2017 года дальше 13.9 не идёт. Новый чип на старой системе проверяется одной строкой.
- 5
Выбрать экран, а затем возможный для него коэффициент
На Windows логический размер, умноженный на коэффициент, это ровно панель. 3840x2160 при 1,5 означало бы монитор 5760x4320, каких не делают.
- 6
Выбрать страну, а из неё часы и язык
Один жребий на оба поля, поэтому пояс и набор языков всегда принадлежат одному месту.
- 7
Закрепить семена шума
Семена холста и звука выводятся из номера профиля один раз. Два чтения одного холста совпадают, а два профиля различаются. Свежая случайность на каждое чтение сама была бы приметой.
Пять шаблонов, и телефон берётся целиком
Шаблон это класс машины, а не подпись. В нём лежат строка платформы, набор подписей браузера, экраны, набор карт, числа ядер, высота полосы меню, число касаний и наборы шрифтов. Берите тот, с которого ваши аккаунты правдоподобно бы работали.
Три настольных шаблона собирают машину из наборов, потому что люди правда собирают разные компьютеры. Два мобильных так не устроены. Экран телефона, плотность точек, видеокарта, ядра, память и фирменные шрифты заданы моделью, поэтому профиль получает один из 22 настоящих телефонов или 7 настоящих планшетов целиком. Pixel с экраном Samsung это не редкий аппарат, а примета.
Шаблон планшета сообщает mobile: false и подпись без слова Mobile, ровно как настоящий Chrome на планшете. Сайты отдают ему настольную вёрстку. Планшет, назвавшийся мобильным, спорил бы сам с собой уже в первом заголовке.
| Шаблон | Какую машину описывает | Когда брать |
|---|---|---|
| macos-chrome | MacIntel, видео Apple Silicon или Intel, macOS от 13.6 до 26.0, коэффициент 2 | аккаунты заводились с мака, или нужен самый опрятный настольный профиль |
| windows-chrome | Win32, карты NVIDIA, Intel или AMD, версия системы от 10.0.0 до 19.0.0, коэффициент от 1 до 1,5 | среда, в которой вы растворяетесь, в основном на Windows, а это большинство площадок |
| linux-chrome | Linux x86_64, рендереры Mesa, пустая версия системы, коэффициент 1 | работа с аккаунтами разработчиков, хостингов и рекламных инструментов, где Linux привычен |
| android-chrome | Linux armv8l, один из 22 настоящих телефонов целиком, 5 касаний, mobile true | площадка обходится с мобильными сессиями иначе, как это делают соцсети |
| android-tablet | то же, но из 7 настоящих планшетов, mobile false и подпись без слова Mobile | нужен планшет, которому отдают настольную вёрстку, но касания он сообщает |
Страна прокси тянет часы и язык одним жребием
Когда у профиля есть прокси, ARMANOS выясняет страну выхода и запоминает её. Справочник на 114 стран переводит этот код в один часовой пояс и один набор языков. Немецкий выход получает Europe/Berlin и de-DE, de, en. Бразильский получает America/Sao_Paulo и pt-BR, pt, en.
Страна выпадает один раз, и оба значения читаются с неё. Два независимых жребия рано или поздно дали бы Asia/Tokyo рядом с pt-BR, а рассогласование окружения стоит в разборах блокировок сразу за общим адресом. Один жребий делает такое сочетание недостижимым.
Большие страны получают разброс. У восьми из них несколько поясов, поэтому сотня американских прокси не читается сотней нью-йоркских часов. Язык остаётся страны целиком, ведь американский выход обязан говорить на en-US. Когда прокси нет вовсе, страна выпадает по семени из набора в 50 штук, и у профиля всё равно настоящие часы, а не ваши.
Часовой пояс
Intl, Date и getTimezoneOffset сдвигаются вместе, а самопроверка сравнивает с каноническим именем ICU: Europe/Kyiv отвечает как Europe/Kiev.
Набор языков
Весь список, а не только первая строка. Настоящий Chrome несёт и базовый язык, и список из одной записи рядом с чужим выходом сам и есть рассогласование.
Голоса синтеза речи
Голоса это опись системы. Профиль, заявивший Бразилию, не должен отдавать японские голоса, поэтому список ограничен языком профиля.
И больше ничего
Экран, карта, ядра, память и шрифты остаются как выпали. Двигать железо вслед за прокси значит сменить машину аккаунту, который её уже знает.
Прокси есть, а страны нет
Программа говорит об этом сообщением и всё равно запускает профиль. Переписать отпечаток задним числом значит показать аккаунту новый компьютер.
Редактор даёт выбор, а не поле для ввода
Откройте редактор отпечатка у профиля, и увидите списки. Экран, ядра, память, коэффициент точек, часовой пояс, языки и видеокарта на настольном шаблоне. На телефоне и планшете вместо частей выбирается модель аппарата, а часы и языки остаются: они принадлежат человеку, а не трубке.
Каждый список выводится из тех же наборов, из которых выбирает генератор, поэтому вы всегда найдёте значение, доставшееся вашему профилю. Оставьте поле пустым, и оно останется выданным, а для большинства профилей это и есть правильный ответ.
Редактор отказывает в том, чего настоящая машина не сообщает, и называет поле вслух, а не выбрасывает молча. Он же дотягивает зависимые значения. Выберите карту, и за ней пойдут ядра, память, архитектура и версия системы. Выберите пояс, и за ним пойдёт язык. Выберите язык, и за ним пойдут часы: связь обязана работать в обе стороны.
Значение вне предложенного списка
Отказ при сохранении, с именем поля. Устаревший список не может тихо потерять настройку, которую вы считали применённой.
Ядра или память, которых у выбранной карты не бывает
Встроенное видео ноутбука с шестнадцатью ядрами отвергается. Пару карты и процессора системы защиты сверяют первой.
Коэффициент, невозможный для выбранного экрана
Сверяется с настоящими панелями, поэтому монитор, которого не выпускают, сохранить нельзя.
Шаблон, которого не знает поколение профиля
Старому профилю говорят прямо. Принять его значило бы показать телефон в карточке и мак на сайте.
Что угодно, набранное руками
Поля свободного ввода нет вовсе. Семь ядер процессора выдают сильнее, чем когда-либо выдало бы выданное значение.
Правки, переставшие подходить после смены шаблона
Пересматриваются на месте и называются, а не отбрасываются при запуске, пока редактор продолжает их показывать.
Профиль остаётся в том поколении, в каком родился
Раз ничего не хранится, любая правка генератора или набора выдаёт каждому существующему профилю другой компьютер при следующем запуске. Это измерено при расширении наборов: у восьми профилей из восьми сменились ядра, память, экран, видеокарта и список шрифтов. Профиль, который грели месяцами, пришёл бы на свои аккаунты новой машиной, а так выглядит захват.
Поэтому у каждого профиля есть номер поколения. Текущий четвёртый. Профили, созданные до нумерации, обслуживает замороженная копия первого генератора, у второго поколения свой замороженный файл, а третье держит на месте побайтовый снимок. Любая правка, сдвинувшая машину третьего поколения хоть на байт, роняет этот стенд.
Поколение едет вместе с профилем, поэтому его копия на другой машине собирается тем же способом. Профиль из сборки новее вашей отказывается запускаться и говорит об этом, вместо того чтобы показать другой компьютер.
В четвёртом поколении часы и язык стали настоящими. До него сотня профилей одного шаблона делила пустой пояс и два английских языковых набора. Оттуда же убрали экраны, которых не бывает, привязали версию системы к видеокарте и добавили поля приборов, голосов, связи и кучи, которые читает вторая заплата движка.
Почему старые профили выглядят прежними
Самопроверка спрашивает у браузера о нём самом
Проверка открывает страницу с тем же семенем профиля и читает то, что прочёл бы сайт. Она идёт скрыто, в отдельной временной папке, поэтому не спорит за папку профиля и не мешает открытой сессии. Она загружает то же расширение защиты, что и настоящий запуск: мерить браузер, которого вы никогда не получаете, значит показывать провалы, которых у вас нет.
Настольный профиль текущего поколения проходит 29 строк. Телефон и планшет проходят 34: добавляются касания, события касания, грубый указатель, ориентация экрана и окно, помещающееся в объявленный экран. По каждой строке видно, прошла она или нет, с измеренным значением, а рядом оценка и название с версией движка, который мерили.
Часть строк ищет машину, а часть ищет саму подмену. Заплатанная функция, переставшая читаться как родной код, доказывает вмешательство вернее, чем честное расхождение.
Значения
Платформа, версия системы и архитектура из подсказок, экран, ядра, память, производитель и рендерер WebGL, часовой пояс, основной язык и весь список.
Сокрытие
navigator.webdriver отвечает false, и его чтец читается как родной код, getParameter читается как родной код, window.chrome на месте, список плагинов не пуст.
Холст
Четыре отдельные строки: два чтения совпадают, один пиксель через два прямоугольника совпадает, прозрачные остаются прозрачными, а маска шума не снимается вычитанием.
Чужие миры
Кадр и рабочий поток обязаны назвать те же ядра и ту же платформу, что документ. На движке уровня JavaScript они этого не делают, и разница видна странице.
Шрифты
Мерятся так, как их меряют на деле: строка рисуется шрифтом, и сравнивается ширина. Wingdings, Zapfino и Copperplate обязаны быть невидимы, если их нет в профиле.
Поля второй заплаты
Число приборов, языки голосов, числа связи в границах собственного огрубления браузера и предел кучи по формуле самого V8.
Глубина подмены зависит от того, где она происходит
В ARMANOS Browser отпечаток живёт в C++ внутри движка и применяется до запуска любого скрипта страницы. Его наследует каждый мир, поэтому рабочий поток и кадр отвечают то же, что документ. Сборка сообщает Chrome 153.0.7978.0, и заявленная версия протягивается в подпись браузера и во все подсказки из работающего движка, так что спорить с проверкой возможностей ей нечем.
На встроенном движке тот же отпечаток ставит внедрённый сценарий в начале документа, в каждом кадре. Он прячет и себя: заплатанные функции сообщают родной исходник, сохраняют имя и число доводов и объявлены методами, поэтому не годятся для new. Поле deviceMemory задаётся только на защищённом источнике: у настоящего Chrome на простом http его нет.
Внедрение закрывает распространённые проверки. Сравняться со собранным движком в согласии между мирами оно не может, и самопроверка показывает эту разницу, а не прячет её. Движок переключается в программе, и проверка сама называет, который мерили.

Чего это не делает
- Это не обещание, что аккаунты не заблокируют и что профиль не распознают. Машина, согласная сама с собой, снимает один разряд признаков. Поведение, репутация адреса и история аккаунта это отдельные задачи.
- Часы не следуют за точным городом выхода. Их решает страна, а внутри большой страны пояс выпадает по семени. Прокси из Лос-Анджелеса может получить любой из четырёх американских поясов. Изменить это значит перевести существующие профили на другую машину, поэтому оставлено следующему поколению.
- Приборы только подрезаются, но не выдумываются. Профиль показывает подмножество настоящих приборов машины. Компьютер без камеры так и сообщит ноль: выдуманный опознаватель прибора сам стал бы приметой.
- В выпущенной сборке чтение пикселей WebGL по-прежнему отдаёт байты мимо шума холста. Самопроверка нарочно красит эту строку красным, а не показывает незаслуженное зелёное. Починка это заплата движка, которая ждёт пересборки.
- Отпечаток нельзя набрать руками или загрузить из файла. Каждое правимое значение это выбор из списка, а остальное выводится из семени.
Как проверить
Каждое утверждение выше сделано в одном месте, и его сторожит стенд, который можно запустить.
- Все значения идут из одного семени, и части сходятся между собой
- packages/shared/src/index.js · apps/desktop/test/fingerprint-consistency.js
- Профиль сохраняет своё поколение, а третье заморожено побайтно
- packages/shared/src/fingerprint-legacy.js · apps/desktop/test/fingerprint-version.js · packages/shared/test/поколение-3-заморожено.js
- Редактор предлагает ровно то, что умеет выдать генератор, и отвергает прочее
- packages/shared/src/index.js · packages/shared/test/выбор-редактора-полон.js
- Правила самопроверки исполняются в настоящем браузере, и весь разбор проходит целиком
- apps/desktop/src/lib/fpAudit.js · apps/desktop/test/fp-audit.js · apps/desktop/test/audit-on-builtin.js
- Кадр и рабочий поток называют ту же машину, что документ
- apps/desktop/src/injected/fingerprint.js · apps/desktop/test/fingerprint-realms.js
Читать дальше
Профили
Что ещё несёт профиль кроме машины: куки, хранилище, расширения и стартовый адрес.
Прокси
Как выясняется и запоминается страна выхода и почему именно она решает часы.
Движок
Собранный Chromium: что он подменяет в C++ и что пока ждёт пересборки.
Проверка отпечатка
Посмотрите, что выдаёт ваш нынешний браузер, в тех же полях, что описывает профиль.
Посмотрите, что выдаёт ваш браузер
Прочтите свой нынешний отпечаток по полям, а затем сравните с тем, что показывает профиль.