在当今的数字世界中,用户和网站所有者越来越关注网络隐私。因此,浏览器指纹技术作为一种无需依赖传统和可预测方法(如 Cookie)就能识别和跟踪用户的工具受到了广泛关注。本文将探讨浏览器指纹识别技术及其工作原理,还将深入探讨使用功能强大的 JavaScript 库 Fingerprintjs
实现指纹识别的方法,最后还将讨论该技术的隐私问题和道德使用问题。
浏览器指纹识别是一种根据用户网络浏览器的独特特征来识别和跟踪用户的方法。在浏览器指纹识别中,网络应用程序会从浏览器中获取大量有关用户浏览器和系统配置的信息。这些信息包括 IP 地址、字体样式、User-Agent 字符串(有关用户浏览器和浏览器版本以及其操作系统和版本的信息)等微小细节,也包括安装的浏览器插件、电池状态、连接的媒体设备(如摄像头和麦克风)甚至浏览器历史记录等模糊细节。
了解浏览器指纹识别的工作原理
指纹识别的神奇之处在于信息过量。通过获取并存储浏览器的主要和次要信息,采用指纹识别技术的网络应用程序几乎可以完全准确地区分一个用户和另一个用户的浏览器。这是因为,即使浏览器类型、浏览器版本、地点或操作系统等主要细节无法区分在同一地点运行相同操作系统和浏览器版本的两个相似设备型号,但从浏览器中获取的其他微小细节一定能为每个设备创建独一无二的 “指纹”。因此,尽管从浏览器中获取的 “独特 “特征通常并不是每个用户独有的,但当所有这些特征结合在一起时,就形成了每个用户浏览器的真正独特数据集。
误区
浏览器指纹识别主要识别的是浏览器和设备配置,而不是个人。如前所述,它根据浏览器及其运行设备的特征和属性创建了独一无二的 “指纹”。这意味着,即使用户使用的是同一类型的设备,指纹识别也能将其浏览器与其他浏览器区分开来。另一方面,值得注意的是,虽然浏览器指纹识别在识别浏览器和设备方面非常有效,但它并不能直接揭示用户的身份,如姓名或电子邮件地址。相反,它是一种在不同会话和交互中跟踪和识别设备的工具。在大多数情况下,其他数据或用户行为会与浏览器指纹识别相结合,从而对用户身份做出有根据的推断。不过,必须指出的是,指纹识别远不是一种万无一失的个人身份识别方法。
指纹识别的用例
浏览器指纹识别技术是一种非常有效的技术,可用于多种用途。下面将讨论其中一些比较著名的用例。
- 用户跟踪和分析:这是指纹识别技术最常见的使用案例。利用指纹识别技术,网站开发人员和所有者可以轻松跟踪用户在网站上的行为和互动,通常包括分析用户访问了哪些页面、在网站上停留了多长时间以及采取了哪些行动。通过收集和分析用户指纹数据,开发人员可以获得有价值的洞察力,并调整内容和用户体验,使其更具吸引力和相关性,而企业则可以利用这些数据改进其业务模式
- 伪认证:在低风险应用中,指纹识别可以取代传统的身份验证,使用户不再需要繁琐的登录流程。例如,如果用户访问一个在线应用程序,其独一无二的指纹就可以作为身份验证的个人资料。在后续使用中,如果指纹与已识别的个人资料详情相匹配,用户就可以访问已保存的个人资料,从而使登录流程无缝衔接,同时保持合理的安全性。然而,这并不适合高安全性的应用,在这些应用中,将传统的身份验证流程与指纹识别相结合是一种更为合理的方法。
- 欺诈检测和预防:浏览器指纹识别的主要应用之一是欺诈检测。例如,在运行促销活动的电子商务网络应用程序中,指纹识别可用于识别和防止欺诈活动,如用户试图创建多个账户以利用促销活动。指纹识别可以标记出这类不正当行为,帮助减少欺诈行为。
- 个性化:指纹识别可用于个性化用户体验。网站可以根据访问者的独特指纹识别出他们的回访者,从而为他们量身定制内容和建议,创造更吸引人、更友好的用户体验。这种个性化可提高用户留存率和满意度。
- 内容限制:网站可以使用浏览器指纹识别来限制对特定内容或功能的访问。例如,新闻网站可以通过跟踪用户的独特指纹来限制用户可以访问的免费文章数量。
- 营销和定向广告:指纹识别可在定向广告中发挥重要作用。广告商可以利用指纹数据创建更准确的用户档案,从而根据用户的兴趣和偏好投放广告。这不仅有利于广告商,还能为用户带来相关性更强、侵扰性更低的广告体验。
Fingerprinting vs Cookies
在深入了解使用 Fingerprintjs 进行浏览器指纹识别的实施和应用之前,了解这种方法与 Cookie 等更传统的跟踪方法的比较至关重要。Cookie 是网站存储在用户设备上的小块数据。这些信息包括会话 ID、用户偏好以及与网站功能相关的其他数据。用户浏览器每次发出后续请求时,Cookie 都会被发回服务器,这样网站就能在不同的会话中识别并记住用户。
比较指纹识别与 Cookie – 优点
- 持久跟踪:指纹识别比 Cookie 更持久,因为 Cookie 可以被用户清除或阻止。即使用户删除了 cookie,指纹识别仍能识别设备及其配置。
- 跨浏览器跟踪:Cookie 通常是浏览器专用的,这意味着它们不能在不同的浏览器中使用。然而,指纹识别技术可以在不同浏览器和浏览器配置文件中识别同一设备。
- 降低用户可见性:Cookie 通常以纯文本形式存储,用户可以轻松管理。相比之下,指纹识别的可见度较低,可以在用户未明确察觉的情况下在后台运行。
- 增强安全性:指纹识别可用作额外的安全和身份验证层,尤其是与其他方法结合使用时。这有助于防止欺诈活动和未经授权的访问。
指纹与 cookie 的比较 – 缺点
- 隐私问题:浏览器指纹识别的主要缺点之一是可能侵犯用户隐私。收集用户设备和行为的大量数据会引发道德和隐私问题,尤其是在不透明的情况下。滥用或不道德的做法会导致法律后果,并损害网站的声誉。相比之下,cookie 更为常见,一般需要用户同意,因为它们受各种隐私法规的约束。网站通常会提示用户接受或拒绝 Cookie,让用户在一定程度上控制所收集的数据。这种明确的同意机制是 cookie 与浏览器指纹识别在隐私和用户意识方面的主要区别之一。
- 受浏览器配置限制:指纹识别依赖于浏览器提供的数据,这意味着浏览器设置的改变(如禁用 JavaScript 或更改用户代理字符串)会影响指纹识别的准确性。这与 cookie 不同,后者或多或少由网络应用程序管理,包含更简洁、更准确的数据。
- 共享环境中的不准确性:在共享或公共环境中,多个用户的浏览器配置可能相似,因此指纹识别可能难以准确区分。总之,虽然浏览器指纹识别在持续跟踪和跨浏览器识别方面具有优势,但它也会引发隐私问题,并在某些情况下面临数据准确性方面的挑战。为了在优势和局限之间取得平衡,网站所有者和开发人员应该负责任地使用指纹识别技术,在必要时确保透明度和用户同意,并在用户隐私是首要问题时考虑使用其他方法。
使用 FingerprintJs 在网络上实现指纹识别
Fingerprintjs 是一个功能强大的程序库,是使用 JavaScript 在浏览器上进行指纹识别的首选。它在开发人员和企业中颇受欢迎,因为它既提供免费的开源版本,也为企业提供基于订阅的闭源版本,并提供免费试用,以确保在计划购买之前适合您的用途。免费版的识别准确率为 40-60%,而专业版(通常也称为指纹识别)的识别准确率高达 99%。我们很快就会看到,虽然功能强大,但该程序库也非常易于使用。
使用 fingerprintjs
限制用户活动的 Demo
在本节中,我们将学习如何使用 fingerprintjs
实现指纹识别,创建一个简单的网站,允许用户下载 PDF 样本文件 5 次,但禁止用户在下载第五次后再下载。这与每天只允许访问有限次数资源的网站类似。我们将使用 fingerprintjs-pro
库,但步骤与基本的 fingerprintjs
库类似。首先,使用命令通过 NPM 安装 fingerprintjs
或 fingerprintjs-pro
库,并用以下代码初始化该库:
//命令 1 适用于免费版。 命令 2 适用于 Pro 版 npm i @fingerprintjs/fingerprintjs npm i @fingerprintjs/fingerprintjs-pro
//免费版 import * as FingerprintJS from "@fingerprintjs/fingerprintjs"; // Initialize the agent at application startup. const fpPromise = import("https://openfpcdn.io/fingerprintjs/v4").then( (FingerprintJS) => FingerprintJS.load() );
//Pro 版本 import * as FingerprintJS from "@fingerprintjs/fingerprintjs-pro"; // Initialize an agent at application startup. const fpPromise = FingerprintJS.load({ apiKey: "your-public-api-key" });
或者,您只需通过 CDN 将该库添加到您的 javascript 文件中,并编写以下代码行即可:
const fpPromise = import("https://fpjscdn.net/v3/eM1jOGTxB4ovda8BRfgw").then( (FingerprintJS) => FingerprintJS.load({ apiKey: "eM1jOGTxB4ovda8BRfgw" }) );
我们的示例将使用 cdn 方法。您一定已经注意到,使用专业服务需要一个 API 密钥。只要在 fingerprintjs 上注册并选择免费试用或商业计划,就能轻松获得 API 密钥。之后,访问 https://dashboard.fingerprint.com/subscriptions/ 就能获得 API 密钥。获得API密钥后,我们就可以继续创建我们的简单应用程序了,如下文代码所示:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> <style> div { display: flex; flex-direction: column; width: 150px; justify-content: center; align-items: center; } </style> </head> <body> <div> <img src="./assets/images.png" alt="pdf image" srcset="" /> <a href="./assets/sample1.pdf" download="samplePDF">Click to download</a> </div> <script> // Initialize the agent on page load. const fpPromise = import( "https://fpjscdn.net/v3/eM1jOGTxB4ovda8BRfgw" ).then((FingerprintJS) => FingerprintJS.load({ apiKey: "eM1jOGTxB4ovda8BRfgw" }) ); let usage = []; // Define the usage array to track downloads and bans // Get the visitorId when you need it. fpPromise.then((fp) => fp.get().then((result) => {console.log(result); const visitorId = result.visitorId; // Set userId based on the visitor's fingerprint let userId = visitorId; console.log(`fingerprinthsId:`, visitorId); const banFunction = () => { // Get the download anchor tag const downloadLink = document.querySelector("a"); downloadLink.addEventListener("click", (e) => { // Check if the user is new or existing and apply download limits const existingUser = usage.find((user) => user.id === userId); if (!existingUser) { // New user, add to the usage array and allow the download usage.push({ id: userId, downloadNo: 1, banned: false }); console.log("downloaded"); } else { // Existing user, increment download count and check limits existingUser.downloadNo++; console.log("downloaded"); if (existingUser.downloadNo > 5) { // User exceeded the download limit, ban them and prevent further downloads existingUser.banned = true; e.preventDefault(); alert("You have exceeded the free download limit of 5."); } } }); }; banFunction(); // Call the function to set up download tracking and bans }) ); </script> </body> </html>
上图显示的是 Demo 应用程序,console
上是 fingerprintjs
返回的用户对象。该对象包含几个有用的属性,特别是该用户浏览器独有的 visitorId
,以及显示识别准确度的 confidence score
。
上图显示了 Demo 应用程序的功能。如前几节所述,该应用程序限制用户下载样本 PDF 文件(超出免费下载 5 次限额)。
隐私问题和合乎道德的使用方式
在本文中,我们探讨了浏览器指纹识别的强大功能以及如何将其用于各种目的。然而,能力越大责任越大,了解这项技术对隐私的影响和道德方面的考虑至关重要。
平衡实用性和隐私性
浏览器指纹识别提供了大量的使用案例,从用户跟踪和分析到欺诈预防和个性化。然而,正如在不同章节中提到的,它也会引发合理的隐私问题。如前所述,浏览器指纹识别不会直接泄露个人身份,如姓名或电子邮件地址。它主要识别浏览器和设备。但是,当其他数据或用户行为与浏览器指纹相结合时,这种区别就会变得模糊,从而有可能识别出个人身份。为了取得适当的平衡,在实施浏览器指纹识别时必须采取隐私优先的方法。必须告知用户数据收集过程,并在隐私法规要求的情况下征得他们的同意。指纹识别应该透明,数据处理应该负责任。
用户意识和同意
浏览器指纹识别与 Cookie 等传统方法的主要区别之一在于用户的认知和同意程度。Cookie 通常通过提示用户接受或拒绝的机制进行管理,让用户对收集的数据有一定的控制权。相比之下,指纹识别可以在后台运行,用户不会明确察觉。这种缺乏用户可见性的情况可能会引发道德问题,尤其是在没有披露大量数据收集的情况下。要解决这些问题,就必须与用户进行透明的沟通,让用户了解收集了哪些数据以及收集的目的。网站应提供明确的隐私政策和用户选择退出或要求删除数据的机制。
道德使用指南
在考虑实施浏览器指纹识别时,尤其是在涉及用户数据的应用中,遵守道德准则至关重要。以下是一些确保负责任使用的最佳实践:
- 透明度:在数据收集实践方面要开诚布公。告知用户你正在收集哪些信息,以及将如何使用这些信息。这种透明度可以建立信任。
- 同意:在隐私法律法规要求的情况下,征得用户同意。用户应有权选择退出数据收集。
- 数据安全:采取强有力的安全措施保护收集到的数据。用户隐私应是重中之重。
- 数据保留:制定明确的政策,规定用户数据的保留期限。只在必要时保留数据,不再需要时删除数据。
- 用户权利:尊重用户访问、修改或删除数据的权利。为用户提供行使这些权利的机制。
- 定期审核:定期审查和审核您的指纹采集实践,确保符合隐私法规和道德标准。
- 教育:不断向团队宣传道德数据处理和用户隐私的重要性。
小结
在本文中,我们使用 Fingerprintjs
探索了浏览器指纹技术,这是一种在数字世界中识别和跟踪用户的创新方法。它强调负责任的使用和隐私问题。我们还讨论了该技术的工作原理,以及从用户跟踪到欺诈检测等各种可能的使用案例。我们还注意到在使用该技术时引发的隐私问题以及道德使用的最佳实践。
原文地址:https://www.wbolt.com/browser-fingerprinting.html