【问题标题】:C++: Portable alternative to CryptGenRandomC++:CryptGenRandom 的可移植替代品
【发布时间】:2017-06-17 09:26:00
【问题描述】:

在应用程序的每次启动时,应创建一条 128 位的随机消息,以使该消息之前未被以最大概率选择过,并且这也应该是安全的(即不能被某些黑客破坏)。例如,使用从系统时间获取种子的标准随机生成器是不安全的,因为它可以通过以某种方式冻结系统时间来破坏(这可能吗?)。

Windows 函数CryptGenRandom 似乎适用于此。但是有便携的替代品吗?如果没有,Linux和Mac有对应的功能吗?

【问题讨论】:

  • 这可能不是那么容易。可以在here 找到一些评论(尽管有点过于自信地提出了恕我直言)。核心信息是,std::random_device 可能有一些缺陷,但我从未接触过它,也许它会对你有所帮助。尽管如此,你的问题有点宽泛。也许将cryptoPRNG的当前状态保存在本地数据库或文件中要容易得多,这很容易做到(并且只需要1个init;碰撞概率可以忽略不计恕我直言)。但这当然取决于具体的用例。
  • @sascha:有趣的链接,std::random_device 也可能有用。谢谢,这很有帮助!

标签: c++ random cryptography


【解决方案1】:

Windows 函数 CryptGenRandom 似乎适用于此。但是有便携的替代品吗?

这取决于你如何看待它;我不确定是否有可以直接包装平台 RNG 的独立包装器。但是大多数加密库都会有一个随机生成器,它直接引用或者——更有可能——从操作系统随机数生成器中为自己播种。

例如,阅读 Crypto++ hereAutoSeeded 生成器。这些库从操作系统提供的功能中抽象出来,为您提供了一个可移植的选项,使对底层平台的调用降至最低(即它们既安全快速)。

如果没有,Linux和Mac有对应的功能吗?

要直接使用加密随机数,请使用/dev/urandom。通常没有理由使用可能会阻塞的/dev/random。不过,我建议使用经过严格审查的库。


特别是如果您使用的是嵌入式或虚拟化设备和操作系统,则需要确保操作系统随机数生成器足够随机。例如,对于虚拟化系统,确保为操作系统安装了 VM 扩展通常是个好主意。

额外的种子也可以添加到随机数生成器中,因此如果您有任何看起来随机的东西,如果您不确定随机数的强度,最好将其添加为种子。

当然,拥有一个带有 RNG 扩展(由操作系统或库使用)例如 Intel RD_RAND 的 CPU 也很有意义。

【讨论】:

    【解决方案2】:

    使用getrandom

    getrandom() 系统调用将 buf 指向的缓冲区填充为 最多 buflen 随机字节。这些字节可用于播种用户 空间随机数生成器或用于加密目的。

    【讨论】:

      猜你喜欢
      • 2015-10-21
      • 2013-08-24
      • 1970-01-01
      • 2019-02-03
      • 1970-01-01
      • 2010-10-02
      • 2013-05-01
      • 1970-01-01
      • 2010-12-10
      相关资源
      最近更新 更多