【问题标题】:How safe is it to remove the "-" in a randomly generated UUID?删除随机生成的 UUID 中的“-”有多安全?
【发布时间】:2019-01-20 16:28:37
【问题描述】:

我有这个代码:

String uuid = UUID.randomUUID().toString().replace("-", "");

删除生成的 UUID 中的“-”有多安全?删除它会破坏它的全局唯一性并使生成的 UUID 容易发生冲突吗?

【问题讨论】:

  • UUID 是一个 128 位的数字。连字符只是供人类使用的显示格式的一部分,它们不是 UUID 本身的一部分。
  • 这是安全的,因为- 总是在相同的位置。请参阅维基百科上的UUID Format
  • @xybrek 为什么要删除连字符?这似乎是一个很奇怪的要求。
  • 另外,我投了反对票,因为这个问题缺乏基础研究。快速查看生成一些会很快表明它们总是在同一个位置,并且查看 UUID 是什么以及它们是如何格式化的也会同样迅速地揭示这一点。请do more researching on your own 并在发布问题之前澄清您对所使用技术的理解。

标签: java uuid


【解决方案1】:

如果删除生成的 UUID 中的“-”有多安全

它是 100% 安全的,因为破折号不是值的一部分。字符串 UUID 是 128 位值的十六进制表示。破折号仅用于显示目的,因此 UUID 会更容易理解。

在将 String 形式的 UUID 传递给外部系统(例如外部 API、数据库和类似的东西)时要小心。他们可能期待破折号出现。

【讨论】:

  • 我已经删除了关于唯一性的单独问题,因为禁止在单个帖子中提出多个问题。您可能希望更新您的答案。
【解决方案2】:

假设我想给白宫打电话。他们的电话号码是 (202) 456-1111。如果我删除该电话号码中的所有破折号和括号,我会留下 2024561111。在此过程中我没有丢失任何信息 - 我只是以一种更难阅读的方式更改了格式。如果我把这个号码打到我的手机上,它仍然可以正常拨打电话,因为电话系统仍然知道前三位是区号,后七位是主号码。

同样,UUID 中的破折号就像电话号码中的额外标点符号 - 包含它们是为了让人们更容易阅读一些潜在的大数字。在 UUID 中,该数字为 128 位长,并以十六进制形式写入,因此与电话号码不同,它不是“明显”的数字,但基本原理是相同的。删除破折号不会更改数字,因此不会影响安全性。

现在,可能发生的情况是,这样做会破坏跨平台的格式兼容性。让我们回到电话号码的类比。我用过的一些网站不允许我输入 2024561111 作为电话号码。他们会坚持我在 (202) 456-1111 中输入空格、破折号和括号。 (我不喜欢这样的网站,但那是另一回事了。)因此,如果您需要将 UUID 的字符串表示形式传递到期望完整格式,包括逗号。

【讨论】:

    【解决方案3】:

    格式正确的 UUID 中的破折号不会随机放置在字符串中 - 它是 RFC 中详述的特定格式 - http://www.ietf.org/rfc/rfc4122.txt

    因此,删除破折号不会影响 UUID 的唯一性。

    但是,如果库希望将破折号作为 UUID 的一部分来将其验证为 UUID,这可能会导致问题。

    为什么要删除它们?

    【讨论】:

      【解决方案4】:

      你可以通过阅读the javadoc来检查字符串是如何创建的:

      UUID                   = <time_low> "-" <time_mid> "-"
                            <time_high_and_version> "-"
                            <variant_and_sequence> "-"
                            <node>
      time_low               = 4*<hexOctet>
      time_mid               = 2*<hexOctet>
      time_high_and_version  = 2*<hexOctet>
      variant_and_sequence   = 2*<hexOctet>
      node                   = 6*<hexOctet>
      

      因此删除- 很好,您可以稍后根据需要将它们重新插入到正确的位置,或者重新创建一个包含相同信息的UUID 对象。

      关于唯一性:How unique is UUID?

      【讨论】:

        【解决方案5】:

        UUID 是一个 128 位的数字。

        带有连字符的十六进制格式只是供人类使用的显示渲染。它是几种可能的显示渲染之一,显示格式(带或不带连字符)不是 UUID 本身。

        【讨论】:

          【解决方案6】:

          UUID 是一个 128 位的数字。数字M 的四位表示UUID 版本,数字N 的最高一到三位表示UUID 变体。 UUID 的二进制编码因系统而异。许多系统完全以大端格式对 UUID 进行编码。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2010-11-14
            • 1970-01-01
            • 1970-01-01
            • 2021-09-03
            • 1970-01-01
            • 1970-01-01
            • 2020-05-22
            • 2022-11-25
            相关资源
            最近更新 更多