【问题标题】:SecureRandom.uuid vs UUID gemSecureRandom.uuid vs UUID gem
【发布时间】:2013-05-15 02:01:44
【问题描述】:

ruby 的 SecureRandom.uuid (Ruby 1.9.3) 和 UUID gem 之间有区别吗? UUID gem 是“旧”的做事方式吗?

从文档中我了解到,gem 作为真正唯一的 UUID 更“安全”,而 SecureRandom.uuid 更像是一个随机字符串,它更有可能不是唯一的。此外,UUID 似乎允许基于文件的持久性来帮助解决此问题。

所以我希望听到一些比我更有洞察力的人的意见。

【问题讨论】:

  • 不独特的“更大机会”在实践中极不可能发生。我认为 UUID gem 是v1 uuid,这里有一些模糊的相关(但不是答案):stackoverflow.com/questions/703035/…
  • 这实际上很好地回答了这个问题。 ruby 版本是 v4,而 gem 是 v1。我使用 ruby​​ 的方法遇到两个相同的 UUID 的可能性很小。在我的设置中使用 v1 实际上为零(除非我生成了 256 exobytes 的 uuid)。 “坦率地说,在没有恶意行为者的单个应用程序空间中,地球上所有生命的灭绝将在你发生碰撞之前很久就发生,即使在版本 4 UUID 上,即使你每秒生成相当多的 UUID。”
  • v1 UUID 也依赖于 MAC 地址的唯一性。在高度虚拟化的世界中,您可能会感到惊讶,虚拟网络适配器的 mac 地址的唯一性可能不如从OpenSSL::Random 获取的随机位那么强。
  • @dbenhur:真有趣。谢谢。是否应该关闭这个问题,因为它看起来更像是一次对话?

标签: ruby uuid


【解决方案1】:

有几种方法可以生成 UUID。

维基百科很好地列出了它们。

http://en.wikipedia.org/wiki/Universally_unique_identifier

v4 UUID:

关于随机的关键思想是,在涉及加密时实际上很难生成。大多数随机数生成器是一个数学公式,只需要看起来随机,并且适用于大多数应用程序。许多程序将使用 $pid |时间,生成一个随机种子。

这不是很有希望...我知道请求是什么时间生成的,只有 65,534 个 pid。我可以从中找出随机种子。

因此,如果您在完全相同的时间(同一秒)使用 $pid | 播种 UUIDv4 数字生成器。 time() 跨越 100 台具有 PID 编号的机器,那么您(我猜)有 100/65536 的重复机会。这可以像这样相当容易地完成

for MACH in `cat machine_list`; do ; ssh $MACH -c "restart something" & ; done

安全随机:

来自 SecureRandom 的代码,尝试 openssl,/dev/urandom,然后是 win32...

从 /dev/urandom 读取时,它是非常随机的,但是如果系统中没有足够的混乱,urandom 会编造一些东西来提供随机数据。从 /dev/random 读取时,它非常随机,如果没有足够的混乱,/dev/random 将阻塞。

UUID:

UUID gem 使用 rand()

   r = [rand(0x100000000)].pack "N"

mac地址。

UUID 也不提供 v4 UUID :)

实际上,如果我遇到 md5 或 uuid 冲突,我会买彩票!

【讨论】:

  • 虽然这是处理 Javascript 随机数生成器,但它是一篇关于“随机”UUID 问题的非常有用的文章。 medium.com/@betable/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
  • 2013-07-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多