从任何浏览器中唯一识别计算机的挑战

Challenge to uniquely identify a computer from any of its browsers

在 HTML5 网络应用程序中,我正在构建一个依赖客户端到客户端通信(使用推送器)的功能。它由服务器端的 PHP 和客户端的 Vue Javascript 组成。

典型情况是:打开一个 window 弹出窗口,然后它直接与其他 windows 打开的 any 另一个浏览器通信同一台电脑。假设您安装了 2 个浏览器,您使用 Firefox 打开网络应用程序弹出窗口,它会与您之前打开的网络应用程序姊妹页面进行通信 Chrome.

到目前为止我们找到的唯一(半)方法是使用public IP地址建立一个以IP地址命名的私人频道……这是基本而有效的。

但是,如果有超过 1 台计算机连接到同一个路由器,所有这些计算机将共享相同的 public IP,这就是事情变得困难的地方!

一个解决方案可能是将计算机的本地 IP 添加到频道名称(已经使用 public IP 构建),但是尽管有一些很好的解决方法,我发现从启动的 RTC 中获取此信息连接,这看起来很不可靠,而且经常违反浏览器隐私规则…

显然,我不能在服务器端使用 PHP 的会话信息,也不能在客户端使用 cookies/本地存储,因为所有这些解决方案都与浏览器本身紧密耦合(感谢上帝 Chrome 不会与您计算机上的 Firefox 共享其 cookie)。如果我们使用 1 个浏览器,这些解决方案将是完美的(并且不需要推送器),但我们需要在同一台机器上处理多个浏览器。

这就是我想知道是否有人已经解决了这个设计挑战并分享了一些技巧,这太棒了!感谢您到目前为止的阅读!

  • 您可以查看浏览器的用户代理。
  • 您可以检查来自不同浏览器的请求组合headers。
  • 您可以在用户的​​浏览器中显式抛出并捕获错误并在请求中发送错误header/body以确定他们使用的浏览器。
  • 您可以画 canvas 画来查看用户的 GPU/CPU 信息(因为您已经在使用 html5,这是一个奖励)。
  • 您可以直接使用 webgl 对可能不同的指标执行相同的操作(因为 canvas 无论如何都使用 webgl)。
  • 您可以检查他们的打字速度,甚至可以建立他们的词汇量和语言使用概况。
  • 如果您请求权限,您可以看到他们连接的所有媒体设备(如耳机),即使只是请求音频权限也会向您显示所有这些设备。
  • 您可以将他们的 CPU 与查找质数或加密密钥所需的时间等进行基准测试。
  • 您可以使用音频指纹识别,它几乎与您的声音一样独特,因为每个浏览器和 CPU 体系结构在数字模式和音频产生的振荡方面略有不同,可以捕获。
  • 您可以查看它们的 window 尺寸和屏幕尺寸以及屏幕分辨率。
  • 可能还有更多我现在没有想到的,您还可以组合使用它们中的任何一个来对设备进行指纹识别。

有关更多信息,请研究浏览器嗅探和数字指纹识别。更重要的是,您可以使用浏览器 sniffing/digital 指纹识别的组合,在同一台计算机上跨他们自己的浏览器以及来自不同设备的不同用户唯一地识别用户。

在您的特定情况下,您不能使用所有浏览器嗅探技术,但您仍然可以使用其中的一些技术,例如用户代理,因为即使他们使用不同的设备,它仍会为您提供用户设备信息浏览器。

数字指纹的想法是你想要建立一个足够高的概率,你可以相当确定它是同一个用户,你永远不能真正确定,但足够确定。屏幕尺寸之类的东西本身并没有多大意义,有数百万台设备在使用 1600 尺寸的屏幕,但是请考虑以下假设示例:

  • 用户设备的屏幕尺寸为 1600,即约 1/8 用户。
  • 用户的设备用了 20 毫秒来加密 4096 密钥,即约 1/8 的用户。
  • 用户的设备用了 40 毫秒来绘制 canvas 图像,即 1/8 的用户。

现在你已经有 8 * 8 * 8 = 1/512 的概率知道它是什么用户,并且基于 3 个根本无法识别的事物,这个值会很快上升。

然而,应该注意的是,使用上述任何浏览器嗅探或数字指纹技术都属于隐私法规(至少在某些国家/地区)。很多像用户代理这样的东西都被弃用了,如果你在网站上做这样的事情,你会遇到像 GDPR 这样的麻烦。我相信如果您明确询问用户的许可并让他们知道,即他们的浏览器正在被指纹识别,您就可以解决这个问题。但是你必须要小心,因为如果它是恶意的,这样做会给你带来麻烦,在用户不知情的情况下做这样的事情是不道德的。