c++ - 使用默认 mt19937 RNG 生成的 boost UUID 是否对 session ID 安全?

标签 c++ security boost uuid boost-uuid

我需要生成 UUID 以用作不可预测/可猜测的 session 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();
}

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

最佳答案

MT 不是加密安全的 RNG。

boost::random_device 保证(由文档)仅在 cruptographically 安全和不确定的情况下存在。请注意,这不适用于 std::random_device

对于任何严肃的应用程序,您不能只相信书面保证。但对于小规模的不重要的,它应该这样做。

编写自己的加密安全代码或系统通常不是一个好主意。描述有人打败您的系统有多糟糕,因为这对您需要投入多少精力非常重要。

关于c++ - 使用默认 mt19937 RNG 生成的 boost UUID 是否对 session ID 安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39532263/

相关文章:

c++ - 文件只读取 1 条记录,然后到达文件末尾,即使还有其他记录

c++ - 是否可以在构造函数之前调用 C++ 对象实例的析构函数?如果是这样,如何?

java - 如何设置 Java 以使用 Eclipse 的用户特定证书?

linux - 我应该在哪个操作系统文件夹中创建一个隐藏文件来表示我的客户的许可证已过期?

php - 如何在 PHP 中使用 Google 重新验证时强制提示密码?

c++ - Boost 堆元素句柄比较和 MSVC 迭代器调试工具

c++ - 将数组成员设置为零

c++ - Linux 可执行文件作为共享库

c++ - 错误 C2039 : 'advance' : is not a member of 'boost::token_iterator<TokenizerFunc,Iterator,Type>'

c++ - 包括 Boost 文件系统头文件