Canvas-відбиток: чому два однакові браузери малюють різні пікселі

Canvas-відбиток — техніка, про яку чули найбільше людей і яку пояснить найменше. Ідея проста: попросити браузер щось намалювати, зчитати пікселі й захешувати їх. Цікаво інше: чому пікселі взагалі різняться між машинами.
Малюнок
Скрипт відбитка створює позаекранний <canvas>, отримує 2D-контекст і малює коротку послідовність: заповнений прямокутник, текст заданим шрифтом, можливо градієнт, криву, емодзі. Потім викликає toDataURL() або getImageData(), щоб зчитати результат, і пропускає байти через хеш. Вихід — короткий рядок на кшталт 71ae464e. Цей рядок і є «хешем canvas».
У малюнку немає нічого секретного, і до GPU не надсилається нічого, чого сторінка не могла б описати сама. Інформація міститься в рендерингу, а не в інструкціях.
Чому пікселі різняться
Основне джерело відмінностей — текст. Рендеринг гліфа залежить від файлу шрифту, який справді вибрано (запасні шрифти різняться залежно від операційної системи), стратегії хінтингу та згладжування (відтінки сірого чи субпіксельне, і в якому порядку субпікселів), растеризатора (FreeType, DirectWrite, CoreText або власного браузера) і від того, чи компонування виконав GPU, чи CPU. Кожен із цих чинників дає трохи інші крайові пікселі. Одного світло-сірого пікселя на краю літери «e» досить, щоб хеш змінився повністю.
Градієнти й криві додають більше: різні графічні драйвери та різні шляхи згладжування по-різному округлюють проміжні значення. У результаті дві машини з тією самою версією браузера, але різними GPU, драйверами чи операційними системами зазвичай дають різні хеші, тоді як та сама машина щоразу дає той самий хеш. Стабільний і різноманітний — саме те, що потрібно трекеру.
Що хеш повідомляє сайту
Сам по собі — нічого про те, хто ви. Він повідомляє сайту, що цей браузер рендерить цей малюнок саме так, а це правда для певної групи машин. Важить розмір цієї групи. Поширений ноутбук із інтегрованою графікою та типовими шрифтами ділить свій хеш із багатьма іншими. Незвичайна конфігурація може бути майже унікальною. У поєднанні з розміром екрана, списком мов і рядком рендерера навіть поширений хеш стає частиною рідкісної комбінації.
Що з цим роблять браузери
Firefox із увімкненим resist-fingerprinting повертає порожній або випадковий canvas і може запитувати дозвіл на доступ до canvas. Brave додає невеликі випадкові збурення до зчитувань canvas, тож хеш змінюється між сайтами та сесіями. Safari обмежує, які шрифти видно, і звужує деякі зчитування. Сам Chromium не рандомізує canvas; браузери на його основі, які прагнуть контролювати відбитки, роблять це власними патчами, і якість цих патчів різна.
Шум не безкоштовний. Хеш canvas, що змінюється при кожному візиті, сам є сигналом, бо справжні браузери так не роблять. Краща стратегія для ізольованого профілю браузера — хеш, який правдоподібний і узгоджений, тож виглядає як одна звичайна машина, а не інша машина щогодини.
Що показує діагностика
PowerScan малює власне невелике зображення і показує вам хеш. Він його ніколи не вивантажує; значення існує лише у вашій вкладці. Перезавантажте, і хеш має бути ідентичним. Якщо ні, у браузері щось вносить шум, і це варто знати до того, як покладатися на цей профіль.


