浏览器指纹是什么?14种指纹的技术原理

视频版链接:

浏览器指纹是什么?14种指纹背后的技术原理

浏览器指纹简介

这个网站在我没登录的情况下,就能生成一个用户ID。即使我打开了浏览器的无痕模式,生成出来的ID也是一模一样。这背后的技术就是浏览器指纹。即使用户没有登录,甚至开启了无痕模式,网站通过浏览器指纹,依然能够准确的知道用户身份。

本期视频,我们来看一下什么是浏览器指纹,为什么网站要搜集浏览器指纹,以及这背后的技术实现原理。

浏览器指纹的组成元素

每当我们访问一些网站的时候,这些网站都会悄悄收集着关于浏览器的相关各种细节,比如IP地址、USER AGENT、用户时区、浏览器插件,甚至你电脑上安装的字体。这些看似无关紧要的信息,当汇聚到一起时,就形成了一个浏览器指纹。这个指纹在大多数情况下都是独一无二的,就像现实生活中的指纹一样,它能让网站识别出一个个独立的访客。

即使清除了cookie或者使用了隐私模式,网站也能使用技术手段收集到用户浏览器指纹,精准的识别访客。无痕模式仅仅是清空了cookie,并且不保存cookie,但是并不能阻止网站追踪用户。

Fingerprintjs项目介绍

GitHub - fingerprintjs/fingerprintjs: The most advanced browser fingerprinting library.

fingerprintjs,这是github上面的一个开源项目,可以看到这个仓库有2万多的star数量。这个项目包含了大部分浏览器指纹的相关技术,并且有完整的源代码实现。

我们往下找,找到这里的Demo,点击这个链接,就可以进入视频开头的那个演示网站。这里显示出根据浏览器指纹计算出来的访客ID。除了ID以外,下面还有一系列计算访客ID所需要的特征值。

视频的后半段,我会讲一下这些特征值都是什么,以及背后的实现原理。

网站收集浏览器指纹的目的

浏览器指纹一般会用于广告。我们浏览一些没登录的网站的时候,广告联盟的广告推送服务都会默默地收集这些浏览器指纹,并且与你正在浏览的网页进行一个绑定。这样广告商就能更精准地识别你喜欢什么样的东西,方便广告商更精准地推送广告。

第二个用法是网站防刷。电商网站和社交平台都希望自己的用户是真实的,他们通常不愿意看到一个人掌握着大量的用户。通过浏览器指纹,网站就可以识别出哪些账号是同一个人操作的,从而设置相应的安全政策,保护网站防止被爬虫,防止被刷数据。

IP地址的作用

每个接入互联网中的设备,都需要一个唯一的地址来进行通讯,这个地址称为IP地址。网站可以通过解析网络层的数据报文,就可以得知源IP地址,也就是用户测的IP地址。网站获取到的IP地址,一般是用户的公网IP地址。

爬爬虾之前有一个完整视频,介绍了什么是公网IP,什么是内网IP,还有典型的家庭网络的拓扑结构,感兴趣的观众可以找来看一下。

比如,百度就提供查看自己IP地址的服务。我们在搜索栏搜索IP地址,就可以看到自己的公网IP地址。网站可以通过这个信息来定位用户、定制内容,并且进行安全检查,比如识别异常登录行为或者防止欺诈。网站可以通过IP地址对访问进行过滤,比如屏蔽掉一部分地区的网络请求。

IP地址与地理位置信息

通过IP地址,网站可以了解用户的国家、地区、城市、经纬度等等。有时候甚至可以获得邮政编码或者社区等更具体的地理位置信息。

网上有很多这种通过IP地址来查找地理位置的数据库。这个网站https://ip-api.com就提供了一个IP地址查找地理位置的服务。

我们往下找,这里可以输入一个IP地址,通过这个IP地址就可以查找它对应的地理位置。

我们可以看到,这个IP地址的归属地是安徽,并且右边给出了一个地图,显示出了大概位置。这里还有对应的经纬度,isp也就是运营商的名字,这里显示出的是江苏电信。

时区信息的获取

有了IP地址提供的位置信息,网站也可以推算出用户的时区。这里的timezone显示出了用户的时区,是亚洲上海。

同样的,网站也可以通过用户浏览器的js代码来得知对应的时区。这里我在浏览器上点击F12,我们切换到控制台这里,输入这段代码回车。这里通过js代码获取到了我浏览器本地的时区,还有本地的时间。

console.log(`本地时间: ${new Date().toLocaleString()}`);
console.log(`时区: ${Intl.DateTimeFormat().resolvedOptions().timeZone}`);

这里获取到的时区还有时间,其实就是我操作系统的时区还有时间。一般来说,通过js代码获取出来的时区应该能跟用户IP地址对应出来的时区对应上。如果网站检测到这两个信息的不一致,可能会引起网站的注意,特别是那种带有防欺诈系统的网站,他们可能会寻找到这种不匹配,作为用户异常行为的指标。

Canvas指纹技术

canvas是网页上一个可以让程序绘制图形的区域。

网站可以通过在canvas上绘制复杂的图形跟文字,然后分析这些内容在电脑上的具体显示方式。

因为每台电脑显示这些图形和文字的细节都有微小的不同,比如轮廓、阴影、颜色和像素排列方式都有细微的差异。这些微小的差异反映了电脑上的一系列设置和硬件特性,比如屏幕分辨率、使用的字体、还有显卡等等。

因为每个人电脑上的配置都是独一无二的,这使得canvas绘制出来的图形成为一种特殊的数字指纹。网站可以利用这个指纹来识别和追踪用户。

比如我们可以通过这一段js代码来生成上面这一个小的canvas区域。

这里面是一个gif动画,但是根据统计,调查了总共35个用户,他们电脑上生成出来的图片呈现方式都是不同的,虽然下面的js代码是一样的。

有了图片以后,我们可以调用这个方法toDataURL函数把图片提取出像素,并且返回一个二进制图像文件的base64编码。然后我们可以计算这个编码的MD5哈希值,从而得到canvas的指纹。

这里我通过网站测试了一下,他通过canvas计算生成了一个canvas的签名。

仅仅依靠这一个canvas指纹的区分,就可以做到10万个用户里面仅仅有两个人的指纹是重复的。配合上其他的浏览器指纹,可以非常精准的识别和追踪用户。

WebGL指纹技术

WebGL是一种JavaScript API,它可以在浏览器里面利用显卡绘制3D图形。

这样网站就可以收集用户的显卡详细信息,从而创建独一无二的浏览器指纹。

这个收集用户浏览器指纹的方式跟那个canvas有点像。网站首先绘制这么一个3D图像,然后他分析这个图像细节上的微小不同,生成一个哈希值。这个哈希值就可以精确的反映我电脑显卡的一些硬件特性还有一些细微的硬件设置。

音频指纹技术

Audio Context是浏览器提供的一组工具,它能够生成跟处理音频,让网站能够播放跟修改声音。

每个设备处理声音的细微差异都可以被网站捕捉到,形成一种特殊的声音指纹。它反映了每个人电脑上的不同音频硬件和软件的设置,所以它也就成为了浏览器指纹之一。

我们可以在这个页面测试一下自己的音频指纹。这里有一个可视化的图形,红色部分是标准的音频,可以看到我电脑生成出来的跟标准音频还是有一些细微差异的。通过计算这些细微的差异,最终得到一个哈希值,这个哈希值也就是我电脑上的音频指纹。

User Agent信息

User Agent是一个浏览器发送给网站的字符串,它包含了浏览器的类型、版本、操作系统等信息。我们在浏览器按F12,找到这里的网络选项卡,我们访问任意一个网站,这里我们找到一个网络请求,在网络请求的Header RequestHeader里面,我们往下找,最下面就有一个User Agent。

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0

在我电脑上,这个User Agent长这个样子,

首先这里有我操作系统的版本,就是Windows 64。可能有的观众会好奇,爬爬虾我这明明是Edge浏览器,为什么User Agent里面有一堆Mozilla,还有苹果,包括这个Safari的内容呢?

这一大串冗余的字符串都是新诞生的浏览器,为了不被其他老牌浏览器排挤,不得不假扮成其他人,从而留下的历史遗留问题。等以后有机会我会专门出一期视频讲讲这部分的内容。

所以这个User Agent里面真正有价值的只有我操作系统的信息,还有最后这一部分标明我是Edge浏览器,使用的是Chromium内核129。

网站可以利用User Agent提供的信息为用户提供与设备和浏览器兼容的内容和功能。比如网站可以利用操作系统信息来判断提供手机版还是网页版的网站。当然User Agent也是浏览器指纹的重要组成部分,因为这里表明了操作系统还有浏览器版本等重要信息。

浏览器语言设置

浏览器语言通常指的是用户在浏览器里设置的首选语言。这决定了用户在访问多语言网站时看到的默认语言版本。

我们还是从刚才的那个请求里,在Header的RequestHeader里面,这里有一个Accept-Language,里面有这么一串的内容。这里面是许多语言的类型,通常按照用户设置的偏好进行排列。

浏览器语言可以通过浏览器的设置进行更改。我们以这个Edge浏览器举例,这里点击设置,找到设置,在左侧找到语言,这里就可以设置浏览器的偏好语言。用户可以列出多个语言,以便网站从中选择一个最适合的语言来显示内容。当然我这个语言的顺序列表也是浏览器指纹的重要组成部分。

字体信息收集

每台计算机上安装的字体集合可能会因为用户的个人选择、操作系统等等的因素有所不同。比如在我的电脑上,我就安装过思源黑体等等的开源免费字体。我之前有个视频,介绍如何在github上面下载开源免费的字体。

浏览器可以通过一些复杂的JavaScript脚本列出用户设备上所有可用的字体。我们找到视频开头说的这个Fingerprint js这个库,我们在它的源代码里面可以找到这个fonts.ts文件。

fingerprintjs/src/sources/fonts.ts at master · fingerprintjs/fingerprintjs (github.com)

这套代码通过这个span的方式逐个绘制上面字体列表里面的字体,然后通过这个方法来判断这些字体是否绘制成功。如果绘制成功,那代表用户的计算机上安装过这个字体。

即使两个用户使用了相同版本的浏览器和相同版本的操作系统,他们安装过的字体很可能不同。这也成为了使用浏览器指纹区分用户的另外一种重要方式。

屏幕分辨率信息

屏幕分辨率不仅包括物理屏幕的实际像素数,还包括浏览器窗口的当前视图大小,也就是浏览器内部除去工具栏、标签栏、滚动条等等内部实际可用窗口的大小。每个人窗口设置不同,它的可视区域大小也是不同的,所以通过屏幕分辨率的取值也能取得一个相对独特的指纹。

我们来演示一下如何使用js代码获取用户的分辨率。这里点击F12,打开一个新的控制台窗口,切换到控制台,然后我把这段代码粘过来。

const screenWidth = window.screen.width*window.devicePixelRatio;
const screenHeight = window.screen.height*window.devicePixelRatio;
console.log(`屏幕分辨率为: ${screenWidth}x${screenHeight}`);const browserWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
console.log(`屏幕内部宽度: ${browserWidth*window.devicePixelRatio}`);
const browserHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
console.log(`屏幕内部高度: ${browserHeight*window.devicePixelRatio}`);

这段代码获取的是用户屏幕的实际分辨率,可以看到我的屏幕分辨率是2K。下面这段代码可以获取用户浏览器里面实际可用窗口的大小,这里我再回车一下。这里显示的是浏览器内部的实际可用宽度跟高度。

Client Rects布局信息

Client Rects它是一种浏览器的API,它提供了网页元素的布局信息,包括元素的位置跟大小,称之为矩形,也就是RECT。两台设备打开的即使是同一个页面,由于它们的硬件配置、操作系统、浏览器版本、屏幕分辨率等等细微差异,渲染出来的网页元素布局信息可能也会有所不同。这些差异可以被用来组装成一个特殊的字符串,也就是浏览器指纹。

我们来看一下它的实现原理:

  1. 首先选择或者生成一个元素

  2. 然后获取元素的Client Rects
  3. 第三步处理或者记录这个Client Rects,比如网站可能会计算元素的面积或者比较元素的位置跟其他元素位置的相对信息
  4. 最后通过这些信息生成浏览器指纹

语音合成与硬件信息

浏览器这里的大声朗读此页面功能,这里面有一个语言选项,在这里可以选择所有可供使用的AI语音列表。

这个列表同样可以被网站获取到,变成一个浏览器指纹。

我们还是进入这个网站browserleaks.com,

这里往下找有一个Speech Voices,这里网站就可以通过js代码获取到这个列表。

当然这个列表也是浏览器指纹,因为每个人的列表可能都是不一样的。

网站可以通过js代码获取两个硬件指标,这两个硬件指标同样可以作为浏览器指纹。我们还是打开浏览器的控制台,我们先输入第一个命令,这个navigator.hardwareConcurrency,这里指的是你电脑一共有多少个线程。我的电脑是8核16线程的,这里显示出了16。

第二个硬件参数是电脑的内存,这里我们输入这个代码navigator.deviceMemory,这就是显示我这台电脑的内存。这里显示的是8GB,不过我这个电脑是16GB的,这个API最多只能获取到8GB。

指纹浏览器的应对方案

俗话说魔高一尺道高一丈,为了应对网站搜集浏览器指纹,一种专门定制的浏览器,也就是指纹浏览器被发明出来。它们的主要功能是让用户可以自由定制、改变并且伪装自己的浏览器指纹。这种浏览器可以允许你在一台电脑上登陆上百个账户,这些账户都拥有着各自不同的指纹,这样就可以避免触发网站的风控。

现在市面上有很多这种品类的浏览器,不过呢他们大部分都是收费的。为了避免恰饭嫌疑,爬爬虾这里就不做推荐了,各位如果感兴趣的话可以自己找来看一下。

好,这就是本期视频的全部内容。感谢大家,我们下期再见。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/33911.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Junit5 单元测试入门

基础知识 常用注解含义 Test:标记一个方法为测试方法BeforeEach:标记的方法会在每个测试方法执行前执行AfterEach:标记的方法会在每个测试方法执行后执行BeforeAll:标记的方法会在所有测试方法执行前执行一次AfterAll&#xff1…

JAVA-平台模块系统原理

菜鸟为了巩固所写 目录 菜鸟为了巩固所写 代码之间的依赖性 绘制类型依赖图 扩展到包之间的依赖关系 进一步延伸到jar包之间的依赖性 组件依赖图 JAVA技术领域中的两个著名的“擦除” Java类型的“大泥球” JAVA模块解析 模块解析的过程 模块路径明确模块的搜索与…

DevExtreme JS ASP.NET Core v24.2新功能预览 - 全新的聊天组件

DevExtreme拥有高性能的HTML5 / JavaScript小部件集合,使您可以利用现代Web开发堆栈(包括React,Angular,ASP.NET Core,jQuery,Knockout等)构建交互式的Web应用程序。从Angular和Reac&#xff0c…

总结与反思-50天小总结

作者:麻瓜也要学魔法 时间:2024/12/4 不知不觉中咱博客的码龄居然50天了!内容主要就是运维方面的知识,主打一个学到哪发到哪。 看了看,50天欸!刚好就50篇文章,不得不说(咱还是真稳定…

centos8 mysql 主从复制

原理 一、一主一从 准备工作 1.主库配置 1、修改配置文件 /etc/my.cnf #mysql 服务ID,保证整个集群环境中唯一,取值范围:1-232-1,默认为 server-id1 #是否只读,1 代表只读,0代表读写 read-only0 #忽略的数据,指不需要同步的数据库 #binlog…

iptables防火墙SNAT与DNAT

第二章 iptables防火墙SNAT与DNAT 文章目录 第二章 iptables防火墙SNAT与DNAT1 SNAT1.1 SNAT原理与应用1.2 SNAT工作原理1.3 SNAT转换前提条件2 SNAT示例2.1 网关[服务器配置](https://so.csdn.net/so/search?q服务器配置&spm1001.2101.3001.7020)2.1.1 网关服务器配置网卡…

【推荐100个unity插件之36】Unity6使用DOTS基础篇——Entities(非常适合做一些弹幕射击游戏)

文章目录 前言DOTS 核心组成DOTS 解决传统问题的痛点1、优化内存布局:2、减少垃圾回收和内存管理开销:3、提高并行计算能力:4、高效的系统和组件设计:5、易于扩展和优化: 安装文档在编辑器下构建 ECS World查看Entity的…

AI一键生成原创圣诞印花图案

一、引言 随着科技的飞速发展,AI 已经深入到我们生活和工作的各个角落,为创意设计领域带来了前所未有的变革。在圣诞即将来临之际,想要设计独特的圣诞印花图案却又担心缺乏灵感或专业技能?别担心,千鹿 AI 为我们提供了…

第一部分 —— 密文类型

文章目录 1. Abstract1.1 Some Conceptions 2. TFHE Ciphertexts3. GLWE3.1 Trivial GLWE ciphertexts3.2 LWE 和 RLWE3.3 Public key encryption 4. GLev4.1 Lev and RLev 5. GGSW5.1 GSW and RGSW 1. Abstract TFHE 指的是 全同态加密策略。意思是,允许对密文进行…

进制转换详解

进制转换的基本概念 进制转换是将一个数从一种基数(进制)转换为另一种基数的过程。例如,将十进制数转换为二进制、八进制或十六进制。 转换过程 以十进制数转换为其他进制为例,转换的基本步骤如下: • 除以目标进制…

构建数字影像生态群,致力推动数字经济发展

在当今数字化浪潮汹涌澎湃的时代,数字经济逐渐成为全球经济增长新的核心驱动力。国际数字影像产业园作为数字影像领域的创新高地,正以其独特的优势和不懈的努力,为推动数字经济的蓬勃发展贡献着卓越力量。 国际数字影像产业园凭借其优越的地理…

性能测试工具1:perf

1.介绍 perf是linxu下的一款性能分析工具。Linux的性能计数器是一个新的基于内核的子系统,它为所有性能分析提供了一个框架。它包括硬件级别(CPU/PMU、性能监控单元)功能和软件(软件计数器、跟踪点)功能。 通过perf,应用程序可以利用PMU…

学籍照片电子版手机拍照采集且批量自动命名的方法

学籍照片作为学生档案的重要组成部分,其电子版的采集和管理显得尤为重要,目前主要通过“全国学籍信息管理系统”进行管理。传统的拍照和命名方式不仅耗时耗力,而且容易出现错误。为了提高效率和准确性,下面介绍如何由教师自己使用…

在wsl2中安装archlinux

在之前的博客中,我介绍了如何在虚拟机或者真实机上安装archlinux并且进行一定的配置,但是实际上Linux不管怎么配置在日常使用中都没有Windows简单便利,在开发有关Linux的程序时过去用虚拟机或者直接在Windows上使用ssh在远程服务器上进行开发…

蓝桥杯真题1259奇怪的捐赠(python版)

解题思路:将100万转换为7进制数,数位之和就是分成的份数 num 100_0000 sum 0 while num > 0:remainder num % 7num num // 7sum remainder print(sum)代码来自题目题解 num对7进行取余,取值范围理应是[0,1,2,3,4,5,6] 但是对于题目给定的捐赠金额实际上并不…

学习日志020---qt信号与槽

作业 import sysfrom PySide6.QtWidgets import QApplication, QWidget,QPushButton,QLineEditfrom Form import Ui_Form from second import Ui_second from PySide6.QtCore import Qtclass MyWidget(QWidget,Ui_Form):def __init__(self):super().__init__()self.setupUi(se…

python学习笔记15 python中的类

上一篇我们介绍了python中的库 ,学习了一些常见的内置库。详细内容可点击–>python学习笔记14 python中的库,常见的内置库(random、hashlib、json、时间、os) 这一篇我们来看一下python中的类 创建一个类 class 类的名称():de…

Redis面试专题-持久化

前言 开始Redis面试知识的复习和资料的收集(收集和参考了网上的优质文章),本篇文章会不断更新,本系列文章主要分为两部分,一部分是该专题所涉及的相关基础知识,另一部分是面试题与思考题,大部分…

Altium Designer基础知识2:交互式差分布线

Altium Designer基础知识2:交互式差分布线 一、本文内容与前置知识点1. 本文内容2. 所用软件 二、差分式布线介绍1. 介绍2. 使用场景 三、布线流程1. 创建差分式布线对2. 布线 一、本文内容与前置知识点 1. 本文内容 Altium Designer的基础知识,差分布…

注意力机制的输入

注意力机制的输入 flyfish 注意力机制用于确定序列中每个组成部分相对于其他部分的相对重要性。 绘图源码 import matplotlib.pyplot as plt from matplotlib.patches import FancyArrowPatchplt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] Fa…