【问题标题】:Are boost UUIDs generated using default mt19937 RNG secure for session IDs?使用默认 mt19937 RNG 生成的 boost UUID 对于会话 ID 是否安全?
【发布时间】:2017-01-24 17:29:09
【问题描述】:

我需要生成 UUID 以用作不可预测/可猜测的会话 ID。

这可以使用boost's UUID library 轻松完成:

boost::uuids::uuid newUUID()
{
  static boost::uuids::random_generator gen;
  return gen();
}

返回的 UUID 可以轻松转换为字符串。

上面的代码等价于:

boost::uuids::uuid newUUID()
{
  static boost::uuids::basic_random_generator<boost::mt19937> gen;
  return gen();
}

所以我们使用的是 Mersenne Twister 19937 伪随机数生成器。看来 boost 需要认真对待seeding it properly 的任务。

但是,我想知道是否可以通过使用像 boost::random_device 这样的非确定性 RNG 来获得一些重要的东西(安全方面),以及它将如何影响 UUID 生成的速度。

boost::uuids::uuid newUUID()
{
  static boost::uuids::basic_random_generator<boost::random_device> gen;
  return gen();
}

非常感谢具有安全洞察力的人的建议。

【问题讨论】:

  • 安全是什么意思? AFAIK 它不是加密安全的。
  • MT 速度非常快且质量相当高,但它不是加密 RNG。不过速度不是问题,MT 可以在普通系统上每秒生成 GB 的随机数据。
  • @NathanOliver 这确实是个问题:如果这些 UUID 将用于不可预测/不可猜测的会话 ID,或者 MT 足够安全,是否有必要使用加密 RNG 来生成 UUID这个目的。
  • 您使用的是哪个操作系统?许多常见的提供了一种生成 UUID 的方法,它们这样做的额外好处是实际上保证了不重复。
  • @Bathsheba 许多不同的(Linux、AIX、Windows、Mac OS X)。但问题不是唯一性,而是可预测性。请参阅下面 Yakk 的答案和 cmets。

标签: c++ security boost uuid boost-uuid


【解决方案1】:

MT 不是加密安全的 RNG。

boost::random_device 保证(由文档)仅在密码安全且不确定的情况下才存在。请注意,std::random_device 并非如此。

对于任何严肃的应用程序,您都不能相信仅仅有文件证明的保证。但对于一个小规模的不重要的,它应该这样做。

编写自己的密码安全代码或系统通常是个坏主意。描述有人打败了你的系统有多糟糕,因为这对你需要付出多少努力真的很重要。

【讨论】:

  • 好的,所以对于生成只需要唯一的 UUID,MT 是完美且快速的,但是对于像会话 ID 一样不可预测/可猜测的 UUID,是否需要加密 RNG?我们不是在讨论生成加密密钥,而是在讨论一个不可猜测的会话 ID。
  • 您可以使用字符串生成器并将来自std::random_device/dev/urandom 的数据提供给它
  • @mgd 非加密安全意味着拥有少量信息的人可以反转该功能。比如,在给定的一个之后找到下一个/上一个,或者在适度选择值之后找到一个模式。我没有解决 MT 是否会生成足够独特的值以降低重复 UUID 的机会。我会假设是这样,但我不会在没有仔细检查的情况下断言它。请注意,以上假设 RNG 的 UUID 生成器并非完全愚蠢:愚蠢的 UUID 生成器可以使 RNG 的质量无关紧要。
  • 感谢您的回答。因此,非加密安全意味着有权访问一个会话 ID 的人可以猜测另一个不可接受的会话 ID。 (我了解生成唯一 ID 和生成不可预测的唯一 ID 之间的区别。)
  • @mgd no ,这意味着它不适合以任何方式、形式或形式的安全问题。大致而言,您应该假设交易对手可以预测它所做的一切(它在每种情况下的输出)。如果这是一个问题,请不要使用它。可能有一些不那么极端的更细粒度的事实,但我不会给你任何这样的保证,我也不应该,即使我认为我知道答案。如果您完全关心安全性,请不要假设任何非加密安全组件。我举了一个洞的例子,我不保证这是唯一的洞
猜你喜欢
  • 2021-10-16
  • 1970-01-01
  • 2017-08-12
  • 1970-01-01
  • 2011-02-24
  • 2012-06-12
  • 1970-01-01
  • 2013-02-03
  • 1970-01-01
相关资源
最近更新 更多