屏幕指纹通过内置浏览器API读取你显示器的分辨率、像素密度和色彩深度,构建一个跨会话、跨隐私窗口和VPN连接均稳定存在的标识符。你现在就可以在 whatsmy.fyi 上查看你的屏幕究竟暴露了什么。
简短总结
屏幕指纹结合了 window.screen 和 window.devicePixelRatio 的值——你的显示分辨率、可用视口、色彩深度和像素密度比率——创建一个持久的设备标识符。单独使用时它贡献3到5比特的熵;与其他指纹信号结合使用时,它成为一个任何清除Cookie或隐私浏览都无法抵抗的可靠跨会话追踪器。
什么是屏幕指纹?
屏幕指纹是一种被动浏览器追踪技术,收集 Screen API 和 window.devicePixelRatio 属性暴露的显示特征。这些API最初设计用于帮助Web开发者构建响应式布局,并为高密度显示器正确调整图像大小——但它们同时也向指纹脚本提供了你物理显示器和硬件配置的详细描述。
与Canvas或WebGL指纹不同,屏幕指纹不需要任何渲染——这些值在页面加载瞬间同步可用,无需任何计算。一行JavaScript代码就足以读取设备的完整屏幕档案。这使其成为追踪者可用的成本最低、可用性最高的指纹向量之一。
屏幕指纹是更广泛的 浏览器指纹 技术家族中的关键信号。它通常与 WebGL指纹 的GPU数据、 音频指纹 的音频栈数据以及 Canvas指纹 捕获的渲染差异结合,形成复合标识符。
屏幕指纹是如何工作的?
每个浏览器都暴露一组描述物理显示器以及CSS像素与物理像素关系的只读属性。指纹脚本在一次遍历中收集所有这些属性。
核心属性
screen.width / screen.height — 物理显示器的总像素尺寸,以CSS像素报告。100%缩放下的1920×1080显示器报告 1920 × 1080。同一显示器在Windows 125%缩放下报告 1536 × 864,立即揭示了操作系统缩放设置。
screen.availWidth / screen.availHeight — 减去任务栏、Dock和系统UI后浏览器窗口可用的屏幕部分。在底部有40像素任务栏的1920×1080 Windows机器上,availHeight 为 1040。这揭示了你运行的操作系统以及你的任务栏是否可见、固定或设置为自动隐藏。
window.devicePixelRatio — 物理显示像素与CSS像素的比率。标准1080p显示器比率为 1。MacBook Pro Retina显示屏为 2。27英寸5K iMac也为 2。3倍缩放的现代Android旗舰机为 3。这个单一值能可靠地区分HiDPI设备和标准显示器、Retina Mac和Windows机器,以及低端手机和旗舰机型。
screen.colorDepth / screen.pixelDepth — 用于表示每个像素颜色的位数。实际上,几乎所有现代设备都是 24,但传统系统和某些远程桌面配置返回 16 或 8,使其成为检测虚拟化或嵌入式环境的有用信号。
screen.orientation.type — 报告显示器是纵向还是横向,以及它是否是硬件的主要方向。在桌面上,这始终是 landscape-primary;在移动设备上,它会变化,几乎总是竖向持握的手机揭示了一种行为模式。
window.innerWidth / window.innerHeight — 浏览器当前视口的尺寸,包括滚动条宽度但不包括浏览器界面。这些会随窗口调整大小而变化,但在页面加载时反映用户的典型窗口大小——另一个行为数据点。
代码
// 屏幕指纹——所有值都是同步的,不需要渲染
function getScreenFingerprint() {
const dpr = window.devicePixelRatio;
return {
// 物理显示尺寸(CSS像素)
screenWidth: window.screen.width,
screenHeight: window.screen.height,
// 系统UI(任务栏、Dock)之后的可用区域
availWidth: window.screen.availWidth,
availHeight: window.screen.availHeight,
// HiDPI/Retina比率——关键区分因素
devicePixelRatio: dpr,
// 物理像素(GPU实际渲染的)
physicalWidth: Math.round(window.screen.width * dpr),
physicalHeight: Math.round(window.screen.height * dpr),
// 色彩深度——通常为24;较低值标记VM或旧系统
colorDepth: window.screen.colorDepth,
pixelDepth: window.screen.pixelDepth,
// 视口——反映加载时的浏览器窗口状态
innerWidth: window.innerWidth,
innerHeight: window.innerHeight,
// 方向
orientation: screen.orientation?.type ?? 'unknown',
};
}
// 示例输出——MacBook Pro 14英寸(2023),Chrome,全屏
// {
// screenWidth: 1512, screenHeight: 982,
// availWidth: 1512, availHeight: 932, ← 50px macOS菜单栏
// devicePixelRatio: 2,
// physicalWidth: 3024, physicalHeight: 1964,
// colorDepth: 24, pixelDepth: 24,
// innerWidth: 1512, innerHeight: 879,
// orientation: 'landscape-primary'
// }仅凭 screenWidth、screenHeight、devicePixelRatio 和 availHeight 的组合就足以区分数十种常见设备类别。包含任务栏偏移量后,无需任何其他信号,许多配置就已变得独一无二。
屏幕指纹有多唯一?
屏幕数据单独提供中等熵值——足以显著缩小你的设备类别范围,但单独使用时很少能唯一识别你。其威力来自于与其他信号的结合方式。
| 信号/发现 | 数值 | 来源 |
|---|---|---|
| 仅屏幕分辨率的熵 | ~3.3 bits | EFF Cover Your Tracks |
| 加入devicePixelRatio后的熵 | ~4.8 bits | BrowserLeaks |
| 全球最常见屏幕分辨率(1920×1080) | 约24%的用户 | Statcounter GlobalStats,2025年 |
| 屏幕档案唯一的用户(分辨率+DPR+OS缩放) | 约18% | Fingerprint.com研究 |
| 实际中观察到的不同devicePixelRatio值 | 1, 1.25, 1.5, 1.75, 2, 2.5, 3, 3.5 | BrowserLeaks数据集 |
| 组合指纹准确率(屏幕+Canvas+WebGL) | >95% | Fingerprint.com Pro |
24%的用户共享1920×1080分辨率听起来像是提供了保护性覆盖——但在该群体中,devicePixelRatio、任务栏高度、OS缩放设置和视口大小的差异迅速细分了人群。125% Windows缩放下的1920×1080显示器产生 screenWidth: 1536,立即将其与100%缩放的用户区分开来。MacBook Pro的16:10宽高比在相近CSS分辨率下与每一台16:9 Windows显示器都不同。
现实中谁在使用屏幕指纹?
广告和跨站追踪
屏幕数据是每个商业指纹平台的标准输入。由于它不需要渲染并在页面加载时立即可用,它是最先收集的信号之一。广告技术网络将其与IP地址、时区、语言和平台数据结合,形成稳定的跨站标识符,作为跨浏览器和设备的Cookie替代品。
欺诈检测和账户安全
安全平台使用屏幕指纹检测新设备登录现有账户的情况。devicePixelRatio 或屏幕尺寸的突然变化——例如从Retina Mac(dpr: 2)切换到标准1080p桌面(dpr: 1)——是账户劫持尝试、凭证填充或会话劫持的强烈风险信号。
设备类型推断
devicePixelRatio 是不读取User-Agent字符串就区分设备类别最可靠的信号之一。比率为 2 或更高可靠地表明HiDPI显示器——在现代智能手机和苹果硬件上几乎普遍存在。结合屏幕尺寸,指纹脚本可以准确推断设备类别(旗舰手机、中端手机、低端手机、笔记本、台式机)并相应调整追踪策略。
付费墙和计量访问绕过检测
执行文章限制的出版商使用屏幕指纹与Canvas和Cookie数据结合,识别清除Cookie或切换到无痕模式的用户。由于屏幕尺寸和像素比率是硬件属性,它们不受会话清除的影响。
屏幕指纹与隐私法律
W3C指纹识别指南 明确将 screen.width、screen.height 和 devicePixelRatio 列为规范作者必须考虑的指纹向量。根据GDPR,可以合理关联到个人的指纹数据构成个人数据处理,需要知情同意或合法利益理由。法国CNIL和英国ICO都表明,用于广告目的的指纹识别需要明确的选择加入同意——但各司法管辖区的执法仍然不一致。
如何保护自己免受屏幕指纹追踪
由于屏幕数据反映真实硬件属性,你无法像清除Cookie那样更改它。防御措施侧重于标准化和噪声注入:
- Tor Browser(最强保护):Tor Browser标准化所有屏幕值——无论你的实际显示器如何,它都报告标准化分辨率(如
1000×900),并将devicePixelRatio固定为1。每个Tor用户对屏幕指纹脚本来看起来完全相同。代价是Tor网络速度较慢。 - Firefox配合
privacy.resistFingerprinting(RFP):在about:config中启用RFP时,Firefox将屏幕尺寸四舍五入到标准化值,并将devicePixelRatio上限设为1。视口大小被填充到最近的200×100像素区间。这使你的屏幕档案与其他RFP用户相同。 - Brave Browser(推荐日常使用):Brave将其Farbling技术应用于屏幕数据——它向
screen.width、screen.height和devicePixelRatio引入每个会话、每个来源的小噪声值。你的指纹每个会话都会变化,在不同网站之间也不同,使跨站关联不可靠,同时不破坏网站功能。 - 避免非标准OS缩放:将显示缩放设置为125%或150%的Windows用户会产生不寻常的
screenWidth值(例如,1920像素显示器产生1536),这比使用100%或200%整数设置更稀少,因此更具识别性。使用标准增量可略微降低熵。 - 浏览器扩展(效果有限):Canvas Blocker等扩展可以配置为欺骗屏幕值,但它们是可检测的,可能在某些网站上破坏响应式Web设计。
- VPN——有用但不足够:VPN屏蔽你的IP地址,但对屏幕属性没有任何影响。在VPN后面,你的
devicePixelRatio和分辨率是相同的。在 whatsmy.fyi 上查看你的真实IP揭示了什么——注意屏幕数据与IP分开显示。
常见问题
屏幕指纹在无痕或隐私模式下有效吗?
有效。隐私浏览模式防止浏览器将浏览历史、Cookie和表单数据保存到磁盘——但它不改变你的物理显示器。你的 screen.width、screen.height 和 devicePixelRatio 在无痕模式和普通窗口中完全相同。只有具有主动显示标准化的浏览器——Tor Browser或开启 privacy.resistFingerprinting 的Firefox——才会产生不同的值。
更改浏览器缩放级别会影响屏幕指纹吗?
浏览器缩放在某些浏览器中会影响 window.devicePixelRatio——例如,Chrome将基础硬件DPR乘以缩放因子,因此标准1080p显示器上的125%缩放产生 devicePixelRatio 为 1.25 而非 1。如果你的缩放级别是非标准的,这可能会增加熵(使你更具唯一性)。screen.width 和 screen.height 不受浏览器缩放影响。
Retina和标准显示器的devicePixelRatio有何不同?
标准1080p显示器的硬件像素密度将一个物理像素映射到一个CSS像素,因此 devicePixelRatio 为 1。苹果Retina显示器每英寸约有两倍多的物理像素,因此报告 2。在MacBook Pro Retina上,1512×982 CSS分辨率对应3024×1964物理像素。现代Android旗舰机通常报告 2.75 或 3。这个单一值是区分苹果芯片笔记本和标准Windows笔记本最可靠的信号之一。
即使我调整浏览器窗口大小,网站也能检测到我的实际物理屏幕吗?
是的。screen.width 和 screen.height 始终反映完整的物理显示尺寸——当你调整浏览器窗口大小时它们不会改变。window.innerWidth 和 window.innerHeight 会随窗口大小变化,但 screen.* 值固定于硬件。只有切换到不同的显示器(例如拔掉外部显示器)时,屏幕尺寸才会改变。
屏幕指纹在移动端还是桌面端更准确?
移动设备产生更高的组合熵,因为Android生态系统中屏幕分辨率和DPR碎片化程度更大。三星、谷歌、一加和小米各自出货分辨率和像素密度不同的设备。桌面更均质——1920×1080 100%缩放占主导——但设置了非标准缩放百分比(125%、150%、175%)的Windows用户产生增加唯一性的不寻常值。
屏幕指纹与Canvas指纹的关系是什么?
屏幕指纹同步读取硬件显示属性——不需要渲染。Canvas指纹渲染一个隐藏图像并读取像素输出以检测GPU和字体渲染差异。它们是互补的:屏幕指纹识别你的显示硬件;Canvas指纹识别你的图形渲染栈。这两个信号几乎从不冲突,放在一起可以显著缩小你的设备配置范围。查看 Canvas指纹指南 深入了解渲染方面。
切换到多显示器设置会改变我的屏幕指纹吗?
window.screen API报告浏览器窗口当前所在显示器的属性,而非所有连接的显示器。如果你将浏览器窗口从1920×1080的副显示器移到2560×1440的主显示器,JavaScript报告的屏幕尺寸会发生变化。这意味着指纹脚本可以检测到经常在显示器间移动窗口的多显示器用户——除了硬件数据外还有一个行为信号。
相关文章
- 什么是浏览器指纹?网站如何在不使用Cookie的情况下追踪你 ——所有指纹信号及其组合方式的完整指南
- 什么是Canvas指纹识别?网站如何在不使用Cookie的情况下追踪你 ——隐藏Canvas渲染如何揭示你的GPU和字体栈
- 什么是WebGL指纹?你的GPU如何识别你的浏览器 ——3D图形API如何直接暴露你的GPU供应商和型号
- 什么是音频指纹?AudioContext如何追踪你的浏览器 ——你设备的音频栈如何产生唯一标识符



