【发布时间】: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