【问题标题】:Why does CWE consider rand() as potentially dangerous为什么 CWE 认为 rand() 具有潜在危险
【发布时间】:2018-09-22 06:34:50
【问题描述】:

我一直在使用 rand() 函数来生成随机数。当我通过 CWE 检查工具检查我的代码时,它认为 rand() 是一个潜在的危险函数,并建议使用加密库。任何人都可以详细说明吗? 生成随机数的最佳和安全替代方案是什么

【问题讨论】:

  • 这个问题可能已经在crypto.stackexchange.com/q/15662得到解答
  • 该工具不够智能,无法分析您的代码并确定您是否编写了 Hangman 游戏或为 NSA 工作。所以它总是在看到 rand() 时抱怨。如果你真的描述了你是如何使用它的,你可以在这里得到很好的建议。
  • 其实这只是一个单元测试。我只是忽略了它。下次为 NSA 编码时我会更加小心

标签: c++ random cryptography


【解决方案1】:

根据https://en.cppreference.com/w/cpp/numeric/random/rand

不保证随机序列的质量 产生。过去,一些 rand() 的实现已经严重 随机性、分布和周期的缺点 产生的序列(在一个众所周知的例子中,低位 在调用之间交替在 1 和 0 之间)。

rand() 不推荐用于严重的随机数生成需求。 推荐使用 C++11 的随机数生成工具 替换 rand()。 (C++11 起)

【讨论】:

  • 引用中列出的原因并不是像 CWE 检查工具那样建议使用加密库的原因。所以这不是 CWE 检查工具认为rand 不好的原因。 Mersenne twister 的良好种子实现将具有良好的随机性、分布和周期,但仍不安全。如果我没记错的话,mt19937 实际上是由 C++ 11 的随机数生成工具使用的。
  • 此答案是在更改问题标题之前发布的。查看编辑历史记录。
  • 这只是标题。剩下的问题是,如果您将rand() 替换为您的建议,代码仍然可能容易受到攻击,并且您的回答中没有一个警告。在最坏的情况下,您只是删除了警告而没有删除漏洞。
猜你喜欢
  • 2021-01-01
  • 2012-01-13
  • 1970-01-01
  • 2011-11-09
  • 2011-03-07
  • 1970-01-01
  • 2015-03-08
  • 2017-12-09
相关资源
最近更新 更多