GUID 有什么是 Whirlpool、MD5 或 SHA-2 哈希没有的?

信息安全 哈希 md5 沙2 sha256
2021-08-20 16:27:38

我试图了解 GUID 的使用,而一直让我想知道的是它们有什么特别之处,以至于我应该考虑使用它们而不是滚动我自己的唯一 ID 类型。换句话说,为什么我不能使用 Whirlpool 哈希,例如:

4bec4b25ff46e09f7d7adb5b4e6842f871d7e9670506d1a65af501cf96ddf194d0132b85e66c1baaeb5319f2030b607121aae2a038458d32b4d4b03dfd46d5ea 

出于同样的原因,而不是 GUID、MD5 或 SHA2?

我什至可以使用 Whirlpool 哈希的子字符串来调整长度,并自己计算碰撞概率,而不是受到 GUID 规范的限制。

3个回答

首先,散列函数有一个输入:你散列一些东西GUID(实际上是UUID)没有任何输入。要使用散列函数生成“唯一标识符”,您只需不要使用散列函数;你必须定义你实际上在散列什么。

有几种生成 UUID 的标准方法;所有这些方法都旨在实现生成的标识符的“唯一性”。方法 3 使用 MD5 散列函数:您通过散列一些已经在全球范围内固有地唯一的数据(例如 URL)生成 UUID,但比 UUID 的 16 个字节长。此方法与您的建议非常相似,只是它清楚地定义了散列的内容(或者至少,它用简单的话说明,在散列时,您散列某些内容并且您的 UUID 不会比您散列的更独特)。方法 5 类似于方法 3,但使用 SHA-1 而不是 MD5(输出被截断为 128 位)。

其他方法使用本地机器的物理或配置元素(例如方法 1 的 MAC 地址和当前时间)。大多数方法是“合作的”:它们确保唯一性,但可以预测新的 UUID 值。对于许多与安全相关的协议,当您需要唯一 ID 时,您实际上需要不会与先前 ID 发生冲突(或仅以可忽略的概率发生冲突)无法被攻击者预测的 ID;为此,您需要“方法 4”:128 位 UUID 包含 122 个随机位,由加密强 PRNG生成。这种方法将提供“非常独特”的标识符,并且比任何自制的构造都要好。

GUID 是您生成然后分配给某物的随机唯一标识符。“哦,你真可爱,我想我会叫你夏洛特”(只有夏洛特是随机的)。

MD5 校验和是对象固有的东西,任何人都可以识别。“你看,按照这个比例,夏洛特重 25 磅”。

UUID 在某些圈子中可以与 GUID 互换,但通常 UUID 具有基本种子。

SHA-1 生成一个非常长的 ID,类似于 MD5,但由于它没有预先确定输出的长度,所以会截断它。有点像 pi,但只排在第十位。

我将假设问题是关于“GUID 与生成任意长度的十六进制数字字符串的任何其他方式”,而不是“GUID 与散列某些东西”,因为这更有意义。(如果我的假设不正确,那么我将删除此答案)

真的,这是关于标准的。根据您打算如何使用此标识符,存储 GUID 可能比存储字符串更容易和更快。例如,大多数数据库系统都有特定的 GUID/UUID 类型,将其存储为 128 位数字而不是字符串,将逐个字符存储。此外,大多数处理 GUID 的系统都有生成新 GUID 的机制,而对于任意随机字符串,它们将没有这些机制。