简体中文

开发者工具 · UUID 生成器

版本 1 UUID 可能泄露您的 MAC 地址和创建时间

· 为什么它很重要

uuid 密码学 浏览器 API

UUIDv1 结构分解,显示时间戳字段和 MAC 地址位
原始 ToolAcre 矢量图

基于时间的 UUID 嵌入 60 位时间戳和 48 位节点标识符(通常是真实的网卡地址)。这篇文章展示了局外人可以从中读到什么,以及为什么随机生成可以避免这个问题。

为您的笔记本电脑命名的标识符 - 为什么导出文档中的 ID 可以不仅仅是一个 ID

版本 1 UUID 由时间戳、MAC 地址和时钟序列值构成。 60 位时间戳表示自 15 10 月 1582(公历改革日期)以来 100 纳秒间隔的数量。 48 位节点字段传统上包含生成 UUID 的网络接口的 IEEE 802 MAC 地址。当您导出文档、运行工具或保存嵌入版本 1 UUID 的文件时,任何后来解码 UUID 的人都可以读取它的创建时间,如果节点字段是真实的 MAC 地址,则可以读取哪台计算机创建了它。这些信息从看似不透明的标识符中悄然泄漏。

v1 UUID 剖析 — 时间戳字段、时钟序列和节点字段,以及每个字段在 36 字符中的位置

信息泄露虽然微妙,但对隐私和归属而言却具有重要意义。如果您与共同作者合作编写文档,并且您的网卡的 MAC 地址位于嵌入式 v1 UUID 中,则观察者可以了解特定机构或位置所使用的硬件。如果您在特定时间导出文档,则每个 v1 UUID 中的时间戳将在工作发生时进行。通过将 UUID 时间戳与已知的发布日期或文档创建事件相关联,可以对试图保持假名的作者进行去匿名化。这些标识符看起来无害,因为它们被格式化为不透明的 36 字符串,但对于任何了解 v1 格式并关心对其进行解码的人来说,它们并不是不透明的。

观察者了解到什么 - 记录何时创建,如果节点是硬件地址,则由哪台机器或供应商创建

v1 UUID 的剖析阐明了可以提取的内容,因为该结构是确定性的并且是公开记录的。 RFC 9562 定义布局:32 位用于 time_low,16 位用于 time_mid,4 位用于版本设置为 1,12 位用于 time_high,2 位用于变体,14 位用于节点的clock_seq 和 48 位。时间字段总共包含 60 位,当组合并解释为 1582 以来的 100 纳秒间隔时,会产生 100 纳秒内的精确创建时刻。 48 位节点字段通常将 MAC 地址保存为 48 位整数。解码是确定性的:读取字节、屏蔽和移动字段并解释值。不涉及密码学; UUID 结构使编码完全透明且可逆。

一段警示性的历史——如何使用嵌入在文档中的标识符来追踪作者身份,无需猜测即可进行描述

RFC 9562 承认隐私历史并建议新应用程序不要使用 v1,因为成本大于收益。该规范包括 v4 随机和 v7 时间排序替代方案,并记录了隐私考虑因素。保留版本 1 是为了向后兼容已部署的系统,但如果没有仔细的安全审查和明确的暴露理由,新代码不应生成 v1 UUID。该漏洞并非疏忽,而是疏忽造成的。这是 20 世纪 80 年代的一个深思熟虑的设计选择,当时隐私泄露不是主要问题,跟踪是分布式系统识别的一个可接受的功能。

工作示例 — 手动将样本 v1 UUID 解码为其时间戳和节点字段

时间线对于理解暴露非常重要,因为在 1998 中创建的文档中的 v1 UUID 包含编码 1998 时代时间的时间戳,这对于取证很有用,但本身就是问题。如果您有带有 v1 UUID 的历史文档并且稍后共享它们,则时间戳会保留。您无法追溯删除在某个时间生成 UUID 的历史事实;您只能停止生成新的 v1 UUID。一些应用程序试图通过用随机假名替换真实 MAC 来缓解 MAC 地址泄漏,但时间戳仍然完全可读和可解码。

v4 和 v7 的变化 — 随机 UUID 不携带机器数据; v7 仍然显示创建时间,这可能可接受也可能不可接受

一个工作示例显示了使用 RFC 9562 示例向量进行实际解码。从规范中获取 v1 UUID ,如 f81d4fae-7dec-11d0-a765-00a0c91e6bf6 。字节顺序为 f81d4fae 7dec 11d0 a765 00a0c91e6bf6。版本字段位于第三组:十六进制的 11d0 是二进制的 0001 0001 1101 0000 。前 4 位是 0001,即版本 1。时间戳分为第一组、第二组和第三组的一部分:time_low 是十进制 4170404526 中的 f81d4fae,time_mid 是十进制 32236 中的 7dec,time_high 是删除十进制 464 中的版本半字节后的第三组中的 1d0。将这些组合成 60 位值,给出一个表示自 1582 以来的 100 纳秒间隔的数字。

这不包括什么 - 一些 v1 实现提供的随机节点选项,它可以减轻但不会消除时间戳泄漏

第四组和第五组中的节点字段是 a765 00a0c91e6bf6,如果位 0 指示真实性,则对机器信息进行编码。如果节点字段的第一个八位字节的最低有效位为零,则表示真实的IEEE地址;如果设置为 1,则表示为隐私而生成的伪随机值。在此示例中,十六进制的 a765 是二进制的 10100111 01100101;最低有效位是 1,所以这是一个随机伪节点,而不是真正的 MAC。然而,较旧的实现有时会直接存储真实的 MAC 地址,如果这样做,48 位节点字段将解码为网卡标识符。 IEEE 维护 MAC 前缀注册表;知道网卡以某个前缀开头可以缩小制造商的范围,并可能缩小所用计算机的型号范围。

要点:了解您的 ID 披露的内容 — ToolAcre 生成器从 CSPRNG 中提取每个标识符,因此不会泄漏 MAC 地址或时间戳

RFC 9562 版本 4 及更高版本故意通过仅使用随机数据而不是编码信息来避免这种泄漏。版本 4 UUID 是 122 位的加密随机数据,其中 4 位用于版本字段,2 位用于变量字段。除了 UUID 有效之外,读取这些位不会显示任何内容;没有要解码的时间戳,没有要提取的机器数据。版本 7 包含一个用于排序好处的时间戳,但该时间戳源自熟悉和标准化的 Unix 纪元,而不是基于晦涩的 1582 值,并且规范明确记录了标识符中存在时间信息。不同版本之间的隐私属性存在根本差异。